]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/core/src/com/ibm/icu/dev/test/util/ULocaleTest.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / core / src / com / ibm / icu / dev / test / util / ULocaleTest.java
1 /*\r
2 **********************************************************************\r
3 * Copyright (c) 2004-2010, International Business Machines\r
4 * Corporation and others.  All Rights Reserved.\r
5 **********************************************************************\r
6 * Author: Alan Liu\r
7 * Created: January 14 2004\r
8 * Since: ICU 2.8\r
9 **********************************************************************\r
10 */\r
11 package com.ibm.icu.dev.test.util;\r
12 \r
13 import java.lang.reflect.InvocationTargetException;\r
14 import java.lang.reflect.Method;\r
15 import java.util.Hashtable;\r
16 import java.util.Iterator;\r
17 import java.util.Locale;\r
18 import java.util.TreeMap;\r
19 \r
20 import com.ibm.icu.dev.test.TestFmwk;\r
21 import com.ibm.icu.lang.UCharacter;\r
22 import com.ibm.icu.text.BreakIterator;\r
23 import com.ibm.icu.text.DateFormat;\r
24 import com.ibm.icu.text.DecimalFormat;\r
25 import com.ibm.icu.text.NumberFormat;\r
26 import com.ibm.icu.text.SimpleDateFormat;\r
27 import com.ibm.icu.text.NumberFormat.SimpleNumberFormatFactory;\r
28 import com.ibm.icu.util.Calendar;\r
29 import com.ibm.icu.util.IllformedLocaleException;\r
30 import com.ibm.icu.util.LocaleData;\r
31 import com.ibm.icu.util.ULocale;\r
32 import com.ibm.icu.util.UResourceBundle;\r
33 import com.ibm.icu.util.VersionInfo;\r
34 import com.ibm.icu.util.ULocale.Builder;\r
35 \r
36 public class ULocaleTest extends TestFmwk {\r
37 \r
38     public static void main(String[] args) throws Exception {\r
39         new ULocaleTest().run(args);\r
40     }\r
41 \r
42     public void TestCalendar() {\r
43         // TODO The CalendarFactory mechanism is not public,\r
44         // so we can't test it yet.  If it becomes public,\r
45         // enable this code.\r
46 \r
47         // class CFactory implements CalendarFactory {\r
48         //     Locale loc;\r
49         //     Calendar proto;\r
50         //     public CFactory(Locale locale, Calendar prototype) {\r
51         //         loc = locale;\r
52         //         proto = prototype;\r
53         //     }\r
54         //     public Calendar create(TimeZone tz, Locale locale) {\r
55         //         // ignore tz -- not relevant to this test\r
56         //         return locale.equals(loc) ?\r
57         //             (Calendar) proto.clone() : null;\r
58         //     }\r
59         //     public String factoryName() {\r
60         //         return "CFactory";\r
61         //     }\r
62         // };\r
63 \r
64         checkService("en_US_BROOKLYN", new ServiceFacade() {\r
65                 public Object create(ULocale req) {\r
66                     return Calendar.getInstance(req);\r
67                 }\r
68                 // }, null, new Registrar() {\r
69                 //     public Object register(ULocale loc, Object prototype) {\r
70                 //         CFactory f = new CFactory(loc, (Calendar) prototype);\r
71                 //         return Calendar.register(f, loc);\r
72                 //     }\r
73                 //     public boolean unregister(Object key) {\r
74                 //         return Calendar.unregister(key);\r
75                 //     }\r
76             });\r
77     }\r
78 \r
79     // Currency getLocale API is obsolete in 3.2.  Since it now returns ULocale.ROOT,\r
80     // and this is not equal to the requested locale zh_TW_TAIPEI, the\r
81     // checkService call would always fail.  So we now omit the test.\r
82     /*\r
83     public void TestCurrency() {\r
84         checkService("zh_TW_TAIPEI", new ServiceFacade() {\r
85                 public Object create(ULocale req) {\r
86                     return Currency.getInstance(req);\r
87                 }\r
88             }, null, new Registrar() {\r
89                     public Object register(ULocale loc, Object prototype) {\r
90                         return Currency.registerInstance((Currency) prototype, loc);\r
91                     }\r
92                     public boolean unregister(Object key) {\r
93                         return Currency.unregister(key);\r
94                     }\r
95                 });\r
96     }\r
97     */\r
98 \r
99     public void TestBreakIterator() {\r
100         checkService("ja_JP_OSAKA", new ServiceFacade() {\r
101                 public Object create(ULocale req) {\r
102                     return BreakIterator.getWordInstance(req);\r
103                 }\r
104             }, null, new Registrar() {\r
105                     public Object register(ULocale loc, Object prototype) {\r
106                         return BreakIterator.registerInstance(\r
107                                                               (BreakIterator) prototype,\r
108                                                               loc, BreakIterator.KIND_WORD);\r
109                     }\r
110                     public boolean unregister(Object key) {\r
111                         return BreakIterator.unregister(key);\r
112                     }\r
113                 });\r
114     }\r
115 \r
116     public void TestDateFormat() {\r
117         checkService("de_CH_ZURICH", new ServiceFacade() {\r
118                 public Object create(ULocale req) {\r
119                     return DateFormat.getDateInstance(DateFormat.DEFAULT, req);\r
120                 }\r
121             }, new Subobject() {\r
122                     public Object get(Object parent) {\r
123                         return ((SimpleDateFormat) parent).getDateFormatSymbols();\r
124                     }\r
125                 }, null);\r
126     }\r
127 \r
128     public void TestNumberFormat() {\r
129         class NFactory extends SimpleNumberFormatFactory {\r
130             NumberFormat proto;\r
131             ULocale locale;\r
132             public NFactory(ULocale loc, NumberFormat fmt) {\r
133                 super(loc);\r
134                 this.locale = loc;\r
135                 this.proto = fmt;\r
136             }\r
137             public NumberFormat createFormat(ULocale loc, int formatType) {\r
138                 return (NumberFormat) (locale.equals(loc) ?\r
139                                        proto.clone() : null);\r
140             }\r
141         }\r
142 \r
143         checkService("fr_FR_NICE", new ServiceFacade() {\r
144                 public Object create(ULocale req) {\r
145                     return NumberFormat.getInstance(req);\r
146                 }\r
147             }, new Subobject() {\r
148                     public Object get(Object parent) {\r
149                         return ((DecimalFormat) parent).getDecimalFormatSymbols();\r
150                     }\r
151                 }, new Registrar() {\r
152                         public Object register(ULocale loc, Object prototype) {\r
153                             NFactory f = new NFactory(loc, (NumberFormat) prototype);\r
154                             return NumberFormat.registerFactory(f);\r
155                         }\r
156                         public boolean unregister(Object key) {\r
157                             return NumberFormat.unregister(key);\r
158                         }\r
159                     });\r
160     }\r
161 \r
162     public void TestSetULocaleKeywords() {\r
163         ULocale uloc = new ULocale("en_Latn_US");\r
164         uloc = uloc.setKeywordValue("Foo", "FooValue");\r
165         if (!"en_Latn_US@foo=FooValue".equals(uloc.getName())) {\r
166             errln("failed to add foo keyword, got: " + uloc.getName());\r
167         }\r
168         uloc = uloc.setKeywordValue("Bar", "BarValue");\r
169         if (!"en_Latn_US@bar=BarValue;foo=FooValue".equals(uloc.getName())) {\r
170             errln("failed to add bar keyword, got: " + uloc.getName());\r
171         }\r
172         uloc = uloc.setKeywordValue("BAR", "NewBarValue");\r
173         if (!"en_Latn_US@bar=NewBarValue;foo=FooValue".equals(uloc.getName())) {\r
174             errln("failed to change bar keyword, got: " + uloc.getName());\r
175         }\r
176         uloc = uloc.setKeywordValue("BaR", null);\r
177         if (!"en_Latn_US@foo=FooValue".equals(uloc.getName())) {\r
178             errln("failed to delete bar keyword, got: " + uloc.getName());\r
179         }\r
180         uloc = uloc.setKeywordValue(null, null);\r
181         if (!"en_Latn_US".equals(uloc.getName())) {\r
182             errln("failed to delete all keywords, got: " + uloc.getName());\r
183         }\r
184     }\r
185 \r
186     /*\r
187      * ticket#5060\r
188      */\r
189     public void TestJavaLocaleCompatibility() {\r
190         Locale backupDefault = Locale.getDefault();\r
191         \r
192         // Java Locale for ja_JP with Japanese calendar\r
193         Locale jaJPJP = new Locale("ja", "JP", "JP");\r
194         Locale jaJP = new Locale("ja", "JP");\r
195         // Java Locale for th_TH with Thai digits\r
196         Locale thTHTH = new Locale("th", "TH", "TH");\r
197  \r
198         Calendar cal = Calendar.getInstance(jaJPJP);\r
199         String caltype = cal.getType();\r
200         if (!caltype.equals("japanese")) {\r
201             errln("FAIL: Invalid calendar type: " + caltype + " /expected: japanese");\r
202         }\r
203 \r
204         cal = Calendar.getInstance(jaJP);\r
205         caltype = cal.getType();\r
206         if (!caltype.equals("gregorian")) {\r
207             errln("FAIL: Invalid calendar type: " + caltype + " /expected: gregorian");\r
208         }\r
209 \r
210         // Default locale\r
211         Locale.setDefault(jaJPJP);\r
212         ULocale defUloc = ULocale.getDefault();\r
213         if (!defUloc.toString().equals("ja_JP@calendar=japanese")) {\r
214             errln("FAIL: Invalid default ULocale: " + defUloc + " /expected: ja_JP@calendar=japanese");\r
215         }\r
216         // Check calendar type\r
217         cal = Calendar.getInstance();\r
218         caltype = cal.getType();\r
219         if (!caltype.equals("japanese")) {\r
220             errln("FAIL: Invalid calendar type: " + caltype + " /expected: japanese");\r
221         }\r
222         Locale.setDefault(backupDefault);\r
223 \r
224         // Set default via ULocale\r
225         ULocale ujaJP_calJP = new ULocale("ja_JP@calendar=japanese");\r
226         ULocale.setDefault(ujaJP_calJP);\r
227         if (!Locale.getDefault().equals(jaJPJP)) {\r
228             errln("FAIL: ULocale#setDefault failed to set Java Locale ja_JP_JP /actual: " + Locale.getDefault());\r
229         }\r
230         // Ticket#6672 - missing keywords\r
231         defUloc = ULocale.getDefault();\r
232         if (!defUloc.equals(ujaJP_calJP)) {\r
233             errln("FAIL: ULocale#getDefault returned " + defUloc + " /expected: ja_JP@calendar=japanese");\r
234         }\r
235         // Set a incompatible base locale via Locale#setDefault\r
236         Locale.setDefault(Locale.US);\r
237         defUloc = ULocale.getDefault();\r
238         if (defUloc.equals(ujaJP_calJP)) {\r
239             errln("FAIL: ULocale#getDefault returned " + defUloc + " /expected: " + ULocale.forLocale(Locale.US));\r
240         }\r
241 \r
242         Locale.setDefault(backupDefault);\r
243 \r
244         // We also want to map ICU locale ja@calendar=japanese to Java ja_JP_JP\r
245         ULocale.setDefault(new ULocale("ja@calendar=japanese"));\r
246         if (!Locale.getDefault().equals(jaJPJP)) {\r
247             errln("FAIL: ULocale#setDefault failed to set Java Locale ja_JP_JP /actual: " + Locale.getDefault());\r
248         }\r
249         Locale.setDefault(backupDefault);\r
250 \r
251         // Java no_NO_NY\r
252         Locale noNONY = new Locale("no", "NO", "NY");\r
253         Locale.setDefault(noNONY);\r
254         defUloc = ULocale.getDefault();\r
255         if (defUloc.toString().equals("nn_NY")) {\r
256             errln("FAIL: Invalid default ULocale: " + defUloc + " /expected: nn_NY");\r
257         }\r
258         Locale.setDefault(backupDefault);\r
259 \r
260         // Java th_TH_TH -> ICU th_TH@numbers=thai\r
261         ULocale.setDefault(new ULocale("th@numbers=thai"));\r
262         if (!Locale.getDefault().equals(thTHTH)) {\r
263             errln("FAIL: ULocale#setDefault failed to set Java Locale th_TH_TH /actual: " + Locale.getDefault());\r
264         }\r
265         Locale.setDefault(backupDefault);\r
266 \r
267         // Set default via ULocale\r
268         ULocale.setDefault(new ULocale("nn_NO"));\r
269         if (!Locale.getDefault().equals(noNONY)) {\r
270             errln("FAIL: ULocale#setDefault failed to set Java Locale no_NO_NY /actual: " + Locale.getDefault());\r
271         }\r
272         Locale.setDefault(backupDefault);        \r
273 \r
274         // We also want to map ICU locale nn to Java no_NO_NY\r
275         ULocale.setDefault(new ULocale("nn"));\r
276         if (!Locale.getDefault().equals(noNONY)) {\r
277             errln("FAIL: ULocale#setDefault failed to set Java Locale no_NO_NY /actual: " + Locale.getDefault());\r
278         }\r
279         Locale.setDefault(backupDefault);\r
280     }\r
281     \r
282     // ================= Infrastructure =================\r
283 \r
284     /**\r
285      * Compare two locale IDs.  If they are equal, return 0.  If `string'\r
286      * starts with `prefix' plus an additional element, that is, string ==\r
287      * prefix + '_' + x, then return 1.  Otherwise return a value < 0.\r
288      */\r
289     static int loccmp(String string, String prefix) {\r
290         int slen = string.length(),\r
291             plen = prefix.length();\r
292         /* 'root' is "less than" everything */\r
293         if (prefix.equals("root")) {\r
294             return string.equals("root") ? 0 : 1;\r
295         }\r
296         // ON JAVA (only -- not on C -- someone correct me if I'm wrong)\r
297         // consider "" to be an alternate name for "root".\r
298         if (plen == 0) {\r
299             return slen == 0 ? 0 : 1;\r
300         }\r
301         if (!string.startsWith(prefix)) return -1; /* mismatch */\r
302         if (slen == plen) return 0;\r
303         if (string.charAt(plen) == '_') return 1;\r
304         return -2; /* false match, e.g. "en_USX" cmp "en_US" */\r
305     }\r
306 \r
307     /**\r
308      * Check the relationship between requested locales, and report problems.\r
309      * The caller specifies the expected relationships between requested\r
310      * and valid (expReqValid) and between valid and actual (expValidActual).\r
311      * Possible values are:\r
312      * "gt" strictly greater than, e.g., en_US > en\r
313      * "ge" greater or equal,      e.g., en >= en\r
314      * "eq" equal,                 e.g., en == en\r
315      */\r
316     void checklocs(String label,\r
317                    String req,\r
318                    Locale validLoc,\r
319                    Locale actualLoc,\r
320                    String expReqValid,\r
321                    String expValidActual) {\r
322         String valid = validLoc.toString();\r
323         String actual = actualLoc.toString();\r
324         int reqValid = loccmp(req, valid);\r
325         int validActual = loccmp(valid, actual);\r
326     boolean reqOK = (expReqValid.equals("gt") && reqValid > 0) ||\r
327         (expReqValid.equals("ge") && reqValid >= 0) ||\r
328         (expReqValid.equals("eq") && reqValid == 0);\r
329     boolean valOK = (expValidActual.equals("gt") && validActual > 0) ||\r
330         (expValidActual.equals("ge") && validActual >= 0) ||\r
331         (expValidActual.equals("eq") && validActual == 0);\r
332         if (reqOK && valOK) {\r
333             logln("Ok: " + label + "; req=" + req + ", valid=" + valid +\r
334                   ", actual=" + actual);\r
335         } else {\r
336             errln("FAIL: " + label + "; req=" + req + ", valid=" + valid +\r
337                   ", actual=" + actual +\r
338           (reqOK ? "" : "\n  req !" + expReqValid + " valid") +\r
339           (valOK ? "" : "\n  val !" + expValidActual + " actual"));\r
340         }\r
341     }\r
342 \r
343     /**\r
344      * Interface used by checkService defining a protocol to create an\r
345      * object, given a requested locale.\r
346      */\r
347     interface ServiceFacade {\r
348         Object create(ULocale requestedLocale);\r
349     }\r
350 \r
351     /**\r
352      * Interface used by checkService defining a protocol to get a\r
353      * contained subobject, given its parent object.\r
354      */\r
355     interface Subobject {\r
356         Object get(Object parent);\r
357     }\r
358 \r
359     /**\r
360      * Interface used by checkService defining a protocol to register\r
361      * and unregister a service object prototype.\r
362      */\r
363     interface Registrar {\r
364         Object register(ULocale loc, Object prototype);\r
365         boolean unregister(Object key);\r
366     }\r
367 \r
368     /**\r
369      * Use reflection to call getLocale() on the given object to\r
370      * determine both the valid and the actual locale.  Verify these\r
371      * for correctness.\r
372      */\r
373     void checkObject(String requestedLocale, Object obj,\r
374                      String expReqValid, String expValidActual) {\r
375         Class[] getLocaleParams = new Class[] { ULocale.Type.class };\r
376         try {\r
377             Class cls = obj.getClass();\r
378             Method getLocale = cls.getMethod("getLocale", getLocaleParams);\r
379             ULocale valid = (ULocale) getLocale.invoke(obj, new Object[] {\r
380                 ULocale.VALID_LOCALE });\r
381             ULocale actual = (ULocale) getLocale.invoke(obj, new Object[] {\r
382                 ULocale.ACTUAL_LOCALE });\r
383             checklocs(cls.getName(), requestedLocale,\r
384                       valid.toLocale(), actual.toLocale(),\r
385                       expReqValid, expValidActual);\r
386         }\r
387 \r
388         // Make the following exceptions _specific_ -- do not\r
389         // catch(Exception), since that will catch the exception\r
390         // that errln throws.\r
391         catch(NoSuchMethodException e1) {\r
392         // no longer an error, Currency has no getLocale\r
393             // errln("FAIL: reflection failed: " + e1);\r
394         } catch(SecurityException e2) {\r
395             errln("FAIL: reflection failed: " + e2);\r
396         } catch(IllegalAccessException e3) {\r
397             errln("FAIL: reflection failed: " + e3);\r
398         } catch(IllegalArgumentException e4) {\r
399             errln("FAIL: reflection failed: " + e4);\r
400         } catch(InvocationTargetException e5) {\r
401         // no longer an error, Currency has no getLocale\r
402             // errln("FAIL: reflection failed: " + e5);\r
403         }\r
404     }\r
405 \r
406     /**\r
407      * Verify the correct getLocale() behavior for the given service.\r
408      * @param requestedLocale the locale to request.  This MUST BE\r
409      * FAKE.  In other words, it should be something like\r
410      * en_US_FAKEVARIANT so this method can verify correct fallback\r
411      * behavior.\r
412      * @param svc a factory object that can create the object to be\r
413      * tested.  This isn't necessary here (one could just pass in the\r
414      * object) but is required for the overload of this method that\r
415      * takes a Registrar.\r
416      */\r
417     void checkService(String requestedLocale, ServiceFacade svc) {\r
418         checkService(requestedLocale, svc, null, null);\r
419     }\r
420 \r
421     /**\r
422      * Verify the correct getLocale() behavior for the given service.\r
423      * @param requestedLocale the locale to request.  This MUST BE\r
424      * FAKE.  In other words, it should be something like\r
425      * en_US_FAKEVARIANT so this method can verify correct fallback\r
426      * behavior.\r
427      * @param svc a factory object that can create the object to be\r
428      * tested.\r
429      * @param sub an object that can be used to retrieve a subobject\r
430      * which should also be tested.  May be null.\r
431      * @param reg an object that supplies the registration and\r
432      * unregistration functionality to be tested.  May be null.\r
433      */\r
434     void checkService(String requestedLocale, ServiceFacade svc,\r
435                       Subobject sub, Registrar reg) {\r
436         ULocale req = new ULocale(requestedLocale);\r
437         Object obj = svc.create(req);\r
438         checkObject(requestedLocale, obj, "gt", "ge");\r
439         if (sub != null) {\r
440             Object subobj = sub.get(obj);\r
441             checkObject(requestedLocale, subobj, "gt", "ge");\r
442         }\r
443         if (reg != null) {\r
444             logln("Info: Registering service");\r
445             Object key = reg.register(req, obj);\r
446             Object objReg = svc.create(req);\r
447             checkObject(requestedLocale, objReg, "eq", "eq");\r
448             if (sub != null) {\r
449                 Object subobj = sub.get(obj);\r
450                 // Assume subobjects don't come from services, so\r
451                 // their metadata should be structured normally.\r
452                 checkObject(requestedLocale, subobj, "gt", "ge");\r
453             }\r
454             logln("Info: Unregistering service");\r
455             if (!reg.unregister(key)) {\r
456                 errln("FAIL: unregister failed");\r
457             }\r
458             Object objUnreg = svc.create(req);\r
459             checkObject(requestedLocale, objUnreg, "gt", "ge");\r
460         }\r
461     }\r
462     private static final int LOCALE_SIZE = 9;\r
463     private static final String[][] rawData2 = new String[][]{\r
464         /* language code */\r
465         {   "en",   "fr",   "ca",   "el",   "no",   "zh",   "de",   "es",  "ja"    },\r
466         /* script code */\r
467         {   "",     "",     "",     "",     "",     "Hans", "", "", ""  },\r
468         /* country code */\r
469         {   "US",   "FR",   "ES",   "GR",   "NO",   "CN", "DE", "", "JP"    },\r
470         /* variant code */\r
471         {   "",     "",     "",     "",     "NY",   "", "", "", ""      },\r
472         /* full name */\r
473         {   "en_US",    "fr_FR",    "ca_ES",\r
474             "el_GR",    "no_NO_NY", "zh_Hans_CN",\r
475             "de_DE@collation=phonebook", "es@collation=traditional",  "ja_JP@calendar=japanese" },\r
476         /* ISO-3 language */\r
477         {   "eng",  "fra",  "cat",  "ell",  "nor",  "zho", "deu", "spa", "jpn"   },\r
478         /* ISO-3 country */\r
479         {   "USA",  "FRA",  "ESP",  "GRC",  "NOR",  "CHN", "DEU", "", "JPN"   },\r
480         /* LCID */\r
481         {   "409", "40c", "403", "408", "814",  "804", "407", "a", "411"     },\r
482 \r
483         /* display language (English) */\r
484         {   "English",  "French",   "Catalan", "Greek",    "Norwegian", "Chinese", "German", "Spanish", "Japanese"    },\r
485         /* display script code (English) */\r
486         {   "",     "",     "",     "",     "",     "Simplified Han", "", "", ""       },\r
487         /* display country (English) */\r
488         {   "United States",    "France",   "Spain",  "Greece",   "Norway", "China", "Germany", "", "Japan"       },\r
489         /* display variant (English) */\r
490         {   "",     "",     "",     "",     "NY",  "", "", "", ""       },\r
491         /* display name (English) */\r
492         {   "English (United States)", "French (France)", "Catalan (Spain)",\r
493             "Greek (Greece)", "Norwegian (Norway, NY)", "Chinese (Simplified Han, China)",\r
494             "German (Germany, Collation=Phonebook Order)", "Spanish (Collation=Traditional)", "Japanese (Japan, Calendar=Japanese Calendar)" },\r
495 \r
496         /* display language (French) */\r
497         {   "anglais",  "fran\\u00E7ais",   "catalan", "grec",    "norv\\u00E9gien",    "chinois", "allemand", "espagnol", "japonais"     },\r
498         /* display script code (French) */\r
499         {   "",     "",     "",     "",     "",     "Hans", "", "", ""         },\r
500         /* display country (French) */\r
501         {   "\\u00C9tats-Unis",    "France",   "Espagne",  "Gr\\u00E8ce",   "Norv\\u00E8ge",    "Chine", "Allemagne", "", "Japon"       },\r
502         /* display variant (French) */\r
503         {   "",     "",     "",     "",     "NY",   "", "", "", ""       },\r
504         /* display name (French) */\r
505         {   "anglais (\\u00C9tats-Unis)", "fran\\u00E7ais (France)", "catalan (Espagne)",\r
506             "grec (Gr\\u00E8ce)", "norv\\u00E9gien (Norv\\u00E8ge, NY)",  "chinois (Hans, Chine)",\r
507             "allemand (Allemagne, Ordonnancement=Ordre de l'annuaire)", "espagnol (Ordonnancement=Ordre traditionnel)", "japonais (Japon, Calendrier=Calendrier japonais)" },\r
508 \r
509         /* display language (Catalan) */\r
510         {   "angl\\u00E8s", "franc\\u00E8s", "catal\\u00E0", "grec",  "noruec", "xin\\u00E9s", "alemany", "espanyol", "japon\\u00E8s"    },\r
511         /* display script code (Catalan) */\r
512         {   "",     "",     "",     "",     "",     "Hans", "", "", ""         },\r
513         /* display country (Catalan) */\r
514         {   "Estats Units", "Fran\\u00E7a", "Espanya",  "Gr\\u00E8cia", "Noruega",  "Xina", "Alemanya", "", "Jap\\u00F3"    },\r
515         /* display variant (Catalan) */\r
516         {   "", "", "",                    "", "NY",    "", "", "", ""    },\r
517         /* display name (Catalan) */\r
518         {   "angl\\u00E8s (Estats Units)", "franc\\u00E8s (Fran\\u00E7a)", "catal\\u00E0 (Espanya)",\r
519             "grec (Gr\\u00E8cia)", "noruec (Noruega, NY)", "xin\\u00E9s (Hans, Xina)",\r
520             "alemany (Alemanya, COLLATION=PHONEBOOK)", "espanyol (COLLATION=TRADITIONAL)", "japon\\u00E8s (Jap\\u00F3, CALENDAR=JAPANESE)" },\r
521 \r
522         /* display language (Greek) */\r
523         {\r
524             "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac",\r
525             "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac",\r
526             "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac",\r
527             "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac",\r
528             "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac",\r
529             "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC",\r
530             "\\u0393\\u03B5\\u03C1\\u03BC\\u03B1\\u03BD\\u03B9\\u03BA\\u03AC",\r
531             "\\u0399\\u03C3\\u03C0\\u03B1\\u03BD\\u03B9\\u03BA\\u03AC",\r
532             "\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03B9\\u03BA\\u03AC"\r
533         },\r
534         /* display script code (Greek) */\r
535         {   "",     "",     "",     "",     "",     "Hans", "", "", ""         },\r
536         /* display country (Greek) */\r
537         {\r
538             "\\u0397\\u03bd\\u03c9\\u03bc\\u03ad\\u03bd\\u03b5\\u03c2 \\u03a0\\u03bf\\u03bb\\u03b9\\u03c4\\u03b5\\u03af\\u03b5\\u03c2",\r
539             "\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1",\r
540             "\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1",\r
541             "\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1",\r
542             "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1",\r
543             "\\u039A\\u03AF\\u03BD\\u03B1",\r
544             "\\u0393\\u03B5\\u03C1\\u03BC\\u03B1\\u03BD\\u03AF\\u03B1",\r
545             "",\r
546             "\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03AF\\u03B1"\r
547         },\r
548         /* display variant (Greek) */\r
549         {   "", "", "", "", "NY", "", "", "", ""    }, /* TODO: currently there is no translation for NY in Greek fix this test when we have it */\r
550         /* display name (Greek) */\r
551         {\r
552             "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac (\\u0397\\u03bd\\u03c9\\u03bc\\u03ad\\u03bd\\u03b5\\u03c2 \\u03a0\\u03bf\\u03bb\\u03b9\\u03c4\\u03b5\\u03af\\u03b5\\u03c2)",\r
553             "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac (\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1)",\r
554             "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1)",\r
555             "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac (\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1)",\r
556             "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac (\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1, NY)",\r
557             "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC (Hans, \\u039A\\u03AF\\u03BD\\u03B1)",\r
558             "\\u0393\\u03B5\\u03C1\\u03BC\\u03B1\\u03BD\\u03B9\\u03BA\\u03AC (\\u0393\\u03B5\\u03C1\\u03BC\\u03B1\\u03BD\\u03AF\\u03B1, COLLATION=PHONEBOOK)",\r
559             "\\u0399\\u03C3\\u03C0\\u03B1\\u03BD\\u03B9\\u03BA\\u03AC (COLLATION=TRADITIONAL)",\r
560             "\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03B9\\u03BA\\u03AC (\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03AF\\u03B1, CALENDAR=JAPANESE)"\r
561         }\r
562     };\r
563 //    private static final int ENGLISH = 0;\r
564 //    private static final int FRENCH = 1;\r
565 //    private static final int CATALAN = 2;\r
566 //    private static final int GREEK = 3;\r
567 //    private static final int NORWEGIAN = 4;\r
568     private static final int LANG = 0;\r
569     private static final int SCRIPT = 1;\r
570     private static final int CTRY = 2;\r
571     private static final int VAR = 3;\r
572     private static final int NAME = 4;\r
573 //    private static final int LANG3 = 5;\r
574 //    private static final int CTRY3 = 6;\r
575 //    private static final int LCID = 7;\r
576 //    private static final int DLANG_EN = 8;\r
577 //    private static final int DSCRIPT_EN = 9;\r
578 //    private static final int DCTRY_EN = 10;\r
579 //    private static final int DVAR_EN = 11;\r
580 //    private static final int DNAME_EN = 12;\r
581 //    private static final int DLANG_FR = 13;\r
582 //    private static final int DSCRIPT_FR = 14;\r
583 //    private static final int DCTRY_FR = 15;\r
584 //    private static final int DVAR_FR = 16;\r
585 //    private static final int DNAME_FR = 17;\r
586 //    private static final int DLANG_CA = 18;\r
587 //    private static final int DSCRIPT_CA = 19;\r
588 //    private static final int DCTRY_CA = 20;\r
589 //    private static final int DVAR_CA = 21;\r
590 //    private static final int DNAME_CA = 22;\r
591 //    private static final int DLANG_EL = 23;\r
592 //    private static final int DSCRIPT_EL = 24;\r
593 //    private static final int DCTRY_EL = 25;\r
594 //    private static final int DVAR_EL = 26;\r
595 //    private static final int DNAME_EL = 27;\r
596 \r
597     public void TestBasicGetters() {\r
598         int i;\r
599         logln("Testing Basic Getters\n");\r
600         for (i = 0; i < LOCALE_SIZE; i++) {\r
601             String testLocale=(rawData2[NAME][i]);\r
602             logln("Testing "+ testLocale+".....\n");\r
603 \r
604             String lang =ULocale.getLanguage(testLocale);\r
605             if (0 !=lang.compareTo(rawData2[LANG][i]))    {\r
606                 errln("  Language code mismatch: "+lang+" versus "+  rawData2[LANG][i]);\r
607             }\r
608 \r
609             String ctry=ULocale.getCountry(testLocale);\r
610             if (0 !=ctry.compareTo(rawData2[CTRY][i]))    {\r
611                 errln("  Country code mismatch: "+ctry+" versus "+  rawData2[CTRY][i]);\r
612             }\r
613 \r
614             String var=ULocale.getVariant(testLocale);\r
615             if (0 !=var.compareTo(rawData2[VAR][i]))    {\r
616                 errln("  Variant code mismatch: "+var+" versus "+  rawData2[VAR][i]);\r
617             }\r
618 \r
619             String name = ULocale.getName(testLocale);\r
620             if (0 !=name.compareTo(rawData2[NAME][i]))    {\r
621                 errln("  Name mismatch: "+name+" versus "+  rawData2[NAME][i]);\r
622             }\r
623 \r
624         }\r
625     }\r
626 \r
627     public void TestPrefixes() {\r
628         // POSIX ids are no longer handled by getName, so POSIX failures are ignored\r
629         final String [][] testData = new String[][]{\r
630             /* null canonicalize() column means "expect same as getName()" */\r
631             {"sv", "", "FI", "AL", "sv-fi-al", "sv_FI_AL", null},\r
632             {"en", "", "GB", "", "en-gb", "en_GB", null},\r
633             {"i-hakka", "", "MT", "XEMXIJA", "i-hakka_MT_XEMXIJA", "i-hakka_MT_XEMXIJA", null},\r
634             {"i-hakka", "", "CN", "", "i-hakka_CN", "i-hakka_CN", null},\r
635             {"i-hakka", "", "MX", "", "I-hakka_MX", "i-hakka_MX", null},\r
636             {"x-klingon", "", "US", "SANJOSE", "X-KLINGON_us_SANJOSE", "x-klingon_US_SANJOSE", null},\r
637 \r
638             {"mr", "", "", "", "mr.utf8", "mr.utf8", "mr"},\r
639             {"de", "", "TV", "", "de-tv.koi8r", "de_TV.koi8r", "de_TV"},\r
640             {"x-piglatin", "", "ML", "", "x-piglatin_ML.MBE", "x-piglatin_ML.MBE", "x-piglatin_ML"},  /* Multibyte English */\r
641             {"i-cherokee", "","US", "", "i-Cherokee_US.utf7", "i-cherokee_US.utf7", "i-cherokee_US"},\r
642             {"x-filfli", "", "MT", "FILFLA", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA"},\r
643             {"no", "", "NO", "NY_B", "no-no-ny.utf32@B", "no_NO_NY.utf32@B", "no_NO_NY_B"},\r
644             {"no", "", "NO", "B",  "no-no.utf32@B", "no_NO.utf32@B", "no_NO_B"},\r
645             {"no", "", "",   "NY", "no__ny", "no__NY", null},\r
646             {"no", "", "",   "NY", "no@ny", "no@ny", "no__NY"},\r
647             {"el", "Latn", "", "", "el-latn", "el_Latn", null},\r
648             {"en", "Cyrl", "RU", "", "en-cyrl-ru", "en_Cyrl_RU", null},\r
649             {"zh", "Hant", "TW", "STROKE", "zh-hant_TW_STROKE", "zh_Hant_TW_STROKE", "zh_Hant_TW@collation=stroke"},\r
650             {"zh", "Hant", "CN", "STROKE", "zh-hant_CN_STROKE", "zh_Hant_CN_STROKE", "zh_Hant_CN@collation=stroke"},\r
651             {"zh", "Hant", "TW", "PINYIN", "zh-hant_TW_PINYIN", "zh_Hant_TW_PINYIN", "zh_Hant_TW@collation=pinyin"},\r
652             {"qq", "Qqqq", "QQ", "QQ", "qq_Qqqq_QQ_QQ", "qq_Qqqq_QQ_QQ", null},\r
653             {"qq", "Qqqq", "", "QQ", "qq_Qqqq__QQ", "qq_Qqqq__QQ", null},\r
654             {"12", "3456", "78", "90", "12_3456_78_90", "12_3456_78_90", null}, /* total garbage */\r
655 \r
656             // odd cases\r
657             {"", "", "", "", "@FOO=bar", "@foo=bar", null},\r
658             {"", "", "", "", "_@FOO=bar", "@foo=bar", null},\r
659             {"", "", "", "", "__@FOO=bar", "@foo=bar", null},\r
660             {"", "", "", "FOO", "__foo@FOO=bar", "__FOO@foo=bar", null}, // we have some of these prefixes\r
661         };\r
662 \r
663         String loc, buf,buf1;\r
664         final String [] testTitles = {\r
665             "ULocale.getLanguage()",\r
666             "ULocale.getScript()",\r
667             "ULocale.getCountry()",\r
668             "ULocale.getVariant()",\r
669             "name",\r
670             "ULocale.getName()",\r
671             "canonicalize()",\r
672         };\r
673         ULocale uloc;\r
674 \r
675         for(int row=0;row<testData.length;row++) {\r
676             loc = testData[row][NAME];\r
677             logln("Test #"+row+": "+loc);\r
678 \r
679             uloc = new ULocale(loc);\r
680 \r
681             for(int n=0;n<=(NAME+2);n++) {\r
682                 if(n==NAME) continue;\r
683 \r
684                 switch(n) {\r
685                 case LANG:\r
686                     buf  = ULocale.getLanguage(loc);\r
687                     buf1 = uloc.getLanguage();\r
688                     break;\r
689 \r
690                 case SCRIPT:\r
691                     buf  = ULocale.getScript(loc);\r
692                     buf1 = uloc.getScript();\r
693                     break;\r
694 \r
695                 case CTRY:\r
696                     buf  = ULocale.getCountry(loc);\r
697                     buf1 = uloc.getCountry();\r
698                     break;\r
699 \r
700                 case VAR:\r
701                     buf  = ULocale.getVariant(loc);\r
702                     buf1 = buf;\r
703                     break;\r
704 \r
705                 case NAME+1:\r
706                     buf  = ULocale.getName(loc);\r
707                     buf1 = uloc.getName();\r
708                     break;\r
709 \r
710                 case NAME+2:\r
711                     buf = ULocale.canonicalize(loc);\r
712                     buf1 = ULocale.createCanonical(loc).getName();\r
713                     break;\r
714 \r
715                 default:\r
716                     buf = "**??";\r
717                     buf1 = buf;\r
718                 }\r
719 \r
720                 logln("#"+row+": "+testTitles[n]+" on "+loc+": -> ["+buf+"]");\r
721 \r
722                 String expected = testData[row][n];\r
723                 if (expected == null && n == (NAME+2)) {\r
724                     expected = testData[row][NAME+1];\r
725                 }\r
726 \r
727                 // ignore POSIX failures in getName, we don't spec behavior in this case\r
728                 if (n == NAME+1 &&\r
729                     (expected.indexOf('.') != -1 ||\r
730                      expected.indexOf('@') != -1)) {\r
731                     continue;\r
732                 }\r
733 \r
734                 if(buf.compareTo(expected)!=0) {\r
735                     errln("#"+row+": "+testTitles[n]+" on "+loc+": -> ["+buf+"] (expected '"+expected+"'!)");\r
736                 }\r
737                 if(buf1.compareTo(expected)!=0) {\r
738                     errln("#"+row+": "+testTitles[n]+" on ULocale object "+loc+": -> ["+buf1+"] (expected '"+expected+"'!)");\r
739                 }\r
740             }\r
741         }\r
742     }\r
743 \r
744     public void TestObsoleteNames(){\r
745         final String[][] tests = new String[][]{\r
746             /* locale, language3, language2, Country3, country2 */\r
747             { "eng_USA", "eng", "en", "USA", "US" },\r
748             { "kok",  "kok", "kok", "", "" },\r
749             { "in",  "ind", "in", "", "" },\r
750             { "id",  "ind", "id", "", "" }, /* NO aliasing */\r
751             { "sh",  "srp", "sh", "", "" },\r
752             { "zz_CS",  "", "zz", "SCG", "CS" },\r
753             { "zz_FX",  "", "zz", "FXX", "FX" },\r
754             { "zz_RO",  "", "zz", "ROU", "RO" },\r
755             { "zz_TP",  "", "zz", "TMP", "TP" },\r
756             { "zz_TL",  "", "zz", "TLS", "TL" },\r
757             { "zz_ZR",  "", "zz", "ZAR", "ZR" },\r
758             { "zz_FXX",  "", "zz", "FXX", "FX" }, /* no aliasing. Doesn't go to PS(PSE). */\r
759             { "zz_ROM",  "", "zz", "ROU", "RO" },\r
760             { "zz_ROU",  "", "zz", "ROU", "RO" },\r
761             { "zz_ZAR",  "", "zz", "ZAR", "ZR" },\r
762             { "zz_TMP",  "", "zz", "TMP", "TP" },\r
763             { "zz_TLS",  "", "zz", "TLS", "TL" },\r
764             { "zz_YUG",  "", "zz", "YUG", "YU" },\r
765             { "mlt_PSE", "mlt", "mt", "PSE", "PS" },\r
766             { "iw", "heb", "iw", "", "" },\r
767             { "ji", "yid", "ji", "", "" },\r
768             { "jw", "jaw", "jw", "", "" },\r
769             { "sh", "srp", "sh", "", "" },\r
770             { "", "", "", "", "" }\r
771         };\r
772 \r
773         for(int i=0;i<tests.length;i++){\r
774             String locale = tests[i][0];\r
775             logln("** Testing : "+ locale);\r
776             String buff, buff1;\r
777             ULocale uloc  = new ULocale(locale);\r
778 \r
779             buff = ULocale.getISO3Language(locale);\r
780             if(buff.compareTo(tests[i][1])!=0){\r
781                 errln("FAIL: ULocale.getISO3Language("+locale+")=="+\r
782                       buff+",\t expected "+tests[i][1]);\r
783             }else{\r
784                 logln("   ULocale.getISO3Language("+locale+")=="+buff);\r
785             }\r
786 \r
787             buff1 = uloc.getISO3Language();\r
788             if(buff1.compareTo(tests[i][1])!=0){\r
789                 errln("FAIL: ULocale.getISO3Language("+locale+")=="+\r
790                       buff+",\t expected "+tests[i][1]);\r
791             }else{\r
792                 logln("   ULocale.getISO3Language("+locale+")=="+buff);\r
793             }\r
794 \r
795             buff = ULocale.getLanguage(locale);\r
796             if(buff.compareTo(tests[i][2])!=0){\r
797                 errln("FAIL: ULocale.getLanguage("+locale+")=="+\r
798                       buff+",\t expected "+tests[i][2]);\r
799             }else{\r
800                 logln("   ULocale.getLanguage("+locale+")=="+buff);\r
801             }\r
802 \r
803             buff = ULocale.getISO3Country(locale);\r
804             if(buff.compareTo(tests[i][3])!=0){\r
805                 errln("FAIL: ULocale.getISO3Country("+locale+")=="+\r
806                       buff+",\t expected "+tests[i][3]);\r
807             }else{\r
808                 logln("   ULocale.getISO3Country("+locale+")=="+buff);\r
809             }\r
810 \r
811             buff1 = uloc.getISO3Country();\r
812             if(buff1.compareTo(tests[i][3])!=0){\r
813                 errln("FAIL: ULocale.getISO3Country("+locale+")=="+\r
814                       buff+",\t expected "+tests[i][3]);\r
815             }else{\r
816                 logln("   ULocale.getISO3Country("+locale+")=="+buff);\r
817             }\r
818 \r
819             buff = ULocale.getCountry(locale);\r
820             if(buff.compareTo(tests[i][4])!=0){\r
821                 errln("FAIL: ULocale.getCountry("+locale+")=="+\r
822                       buff+",\t expected "+tests[i][4]);\r
823             }else{\r
824                 logln("   ULocale.getCountry("+locale+")=="+buff);\r
825             }\r
826         }\r
827 \r
828         if (ULocale.getLanguage("iw_IL").compareTo( ULocale.getLanguage("he_IL"))==0) {\r
829             errln("he,iw ULocale.getLanguage mismatch");\r
830         }\r
831 \r
832         String buff = ULocale.getLanguage("kok_IN");\r
833         if(buff.compareTo("kok")!=0){\r
834             errln("ULocale.getLanguage(\"kok\") failed. Expected: kok Got: "+buff);\r
835         }\r
836     }\r
837     public void TestCanonicalization(){\r
838         final String[][]testCases = new String[][]{\r
839             { "ca_ES_PREEURO", "ca_ES_PREEURO", "ca_ES@currency=ESP" },\r
840             { "de_AT_PREEURO", "de_AT_PREEURO", "de_AT@currency=ATS" },\r
841             { "de_DE_PREEURO", "de_DE_PREEURO", "de_DE@currency=DEM" },\r
842             { "de_LU_PREEURO", "de_LU_PREEURO", "de_LU@currency=EUR" },\r
843             { "el_GR_PREEURO", "el_GR_PREEURO", "el_GR@currency=GRD" },\r
844             { "en_BE_PREEURO", "en_BE_PREEURO", "en_BE@currency=BEF" },\r
845             { "en_IE_PREEURO", "en_IE_PREEURO", "en_IE@currency=IEP" },\r
846             { "es_ES_PREEURO", "es_ES_PREEURO", "es_ES@currency=ESP" },\r
847             { "eu_ES_PREEURO", "eu_ES_PREEURO", "eu_ES@currency=ESP" },\r
848             { "fi_FI_PREEURO", "fi_FI_PREEURO", "fi_FI@currency=FIM" },\r
849             { "fr_BE_PREEURO", "fr_BE_PREEURO", "fr_BE@currency=BEF" },\r
850             { "fr_FR_PREEURO", "fr_FR_PREEURO", "fr_FR@currency=FRF" },\r
851             { "fr_LU_PREEURO", "fr_LU_PREEURO", "fr_LU@currency=LUF" },\r
852             { "ga_IE_PREEURO", "ga_IE_PREEURO", "ga_IE@currency=IEP" },\r
853             { "gl_ES_PREEURO", "gl_ES_PREEURO", "gl_ES@currency=ESP" },\r
854             { "it_IT_PREEURO", "it_IT_PREEURO", "it_IT@currency=ITL" },\r
855             { "nl_BE_PREEURO", "nl_BE_PREEURO", "nl_BE@currency=BEF" },\r
856             { "nl_NL_PREEURO", "nl_NL_PREEURO", "nl_NL@currency=NLG" },\r
857             { "pt_PT_PREEURO", "pt_PT_PREEURO", "pt_PT@currency=PTE" },\r
858             { "de__PHONEBOOK", "de__PHONEBOOK", "de@collation=phonebook" },\r
859             { "en_GB_EURO", "en_GB_EURO", "en_GB@currency=EUR" },\r
860             { "en_GB@EURO", null, "en_GB@currency=EUR" }, /* POSIX ID */\r
861             { "es__TRADITIONAL", "es__TRADITIONAL", "es@collation=traditional" },\r
862             { "hi__DIRECT", "hi__DIRECT", "hi@collation=direct" },\r
863             { "ja_JP_TRADITIONAL", "ja_JP_TRADITIONAL", "ja_JP@calendar=japanese" },\r
864             { "th_TH_TRADITIONAL", "th_TH_TRADITIONAL", "th_TH@calendar=buddhist" },\r
865             { "zh_TW_STROKE", "zh_TW_STROKE", "zh_TW@collation=stroke" },\r
866             { "zh__PINYIN", "zh__PINYIN", "zh@collation=pinyin" },\r
867             { "zh@collation=pinyin", "zh@collation=pinyin", "zh@collation=pinyin" },\r
868             { "zh_CN@collation=pinyin", "zh_CN@collation=pinyin", "zh_CN@collation=pinyin" },\r
869             { "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin" },\r
870             { "en_US_POSIX", "en_US_POSIX", "en_US_POSIX" },\r
871             { "hy_AM_REVISED", "hy_AM_REVISED", "hy_AM_REVISED" },\r
872             { "no_NO_NY", "no_NO_NY", "no_NO_NY" /* not: "nn_NO" [alan ICU3.0] */ },\r
873             { "no@ny", null, "no__NY" /* not: "nn" [alan ICU3.0] */ }, /* POSIX ID */\r
874             { "no-no.utf32@B", null, "no_NO_B" /* not: "nb_NO_B" [alan ICU3.0] */ }, /* POSIX ID */\r
875             { "qz-qz@Euro", null, "qz_QZ@currency=EUR" }, /* qz-qz uses private use iso codes */\r
876             { "en-BOONT", "en__BOONT", "en__BOONT" }, /* registered name */\r
877             { "de-1901", "de_1901", "de__1901" }, /* registered name */\r
878             { "de-1906", "de_1906", "de__1906" }, /* registered name */\r
879             { "sr-SP-Cyrl", "sr_SP_CYRL", "sr_Cyrl_RS" }, /* .NET name */\r
880             { "sr-SP-Latn", "sr_SP_LATN", "sr_Latn_RS" }, /* .NET name */\r
881             { "sr_YU_CYRILLIC", "sr_YU_CYRILLIC", "sr_Cyrl_RS" }, /* Linux name */\r
882             { "uz-UZ-Cyrl", "uz_UZ_CYRL", "uz_Cyrl_UZ" }, /* .NET name */\r
883             { "uz-UZ-Latn", "uz_UZ_LATN", "uz_Latn_UZ" }, /* .NET name */\r
884             { "zh-CHS", "zh_CHS", "zh_Hans" }, /* .NET name */\r
885             { "zh-CHT", "zh_CHT", "zh_Hant" }, /* .NET name This may change back to zh_Hant */\r
886 \r
887             /* posix behavior that used to be performed by getName */\r
888             { "mr.utf8", null, "mr" },\r
889             { "de-tv.koi8r", null, "de_TV" },\r
890             { "x-piglatin_ML.MBE", null, "x-piglatin_ML" },\r
891             { "i-cherokee_US.utf7", null, "i-cherokee_US" },\r
892             { "x-filfli_MT_FILFLA.gb-18030", null, "x-filfli_MT_FILFLA" },\r
893             { "no-no-ny.utf8@B", null, "no_NO_NY_B" /* not: "nn_NO" [alan ICU3.0] */ }, /* @ ignored unless variant is empty */\r
894 \r
895             /* fleshing out canonicalization */\r
896             /* sort keywords, ';' is separator so not present at end in canonical form */\r
897             { "en_Hant_IL_VALLEY_GIRL@currency=EUR;calendar=Japanese;", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR" },\r
898             /* already-canonical ids are not changed */\r
899             { "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR" },\r
900             /* PRE_EURO and EURO conversions don't affect other keywords */\r
901             /* not in spec\r
902                { "es_ES_PREEURO@CALendar=Japanese", "es_ES_PREEURO@calendar=Japanese", "es_ES@calendar=Japanese;currency=ESP" },\r
903                { "es_ES_EURO@SHOUT=zipeedeedoodah", "es_ES_EURO@shout=zipeedeedoodah", "es_ES@currency=EUR;shout=zipeedeedoodah" },\r
904             */\r
905             /* currency keyword overrides PRE_EURO and EURO currency */\r
906             /* not in spec\r
907                { "es_ES_PREEURO@currency=EUR", "es_ES_PREEURO@currency=EUR", "es_ES@currency=EUR" },\r
908                { "es_ES_EURO@currency=ESP", "es_ES_EURO@currency=ESP", "es_ES@currency=ESP" },\r
909             */\r
910             /* norwegian is just too weird, if we handle things in their full generality */\r
911             /* this is a negative test to show that we DO NOT handle 'lang=no,var=NY' specially. */\r
912             { "no-Hant-GB_NY@currency=$$$", "no_Hant_GB_NY@currency=$$$", "no_Hant_GB_NY@currency=$$$" /* not: "nn_Hant_GB@currency=$$$" [alan ICU3.0] */ },\r
913 \r
914             /* test cases reflecting internal resource bundle usage */\r
915             /* root is just a language */\r
916             { "root@kw=foo", "root@kw=foo", "root@kw=foo" },\r
917             /* level 2 canonicalization should not touch basename when there are keywords and it is null */\r
918             { "@calendar=gregorian", "@calendar=gregorian", "@calendar=gregorian" },\r
919         };\r
920 \r
921         for(int i = 0; i< testCases.length;i++){\r
922             String[] testCase = testCases[i];\r
923             String source = testCase[0];\r
924             String level1Expected = testCase[1];\r
925             String level2Expected = testCase[2];\r
926 \r
927             if (level1Expected != null) { // null means we have no expectations for how this case is handled\r
928                 String level1 = ULocale.getName(source);\r
929                 if (!level1.equals(level1Expected)) {\r
930                     errln("ULocale.getName error for: '" + source +\r
931                           "' expected: '" + level1Expected + "' but got: '" + level1 + "'");\r
932                 } else {\r
933                     logln("Ulocale.getName for: '" + source + "' returned: '" + level1 + "'");\r
934                 }\r
935             } else {\r
936                 logln("ULocale.getName skipped: '" + source + "'");\r
937             }\r
938 \r
939             if (level2Expected != null) {\r
940                 String level2 = ULocale.canonicalize(source);\r
941                 if(!level2.equals(level2Expected)){\r
942                     errln("ULocale.getName error for: '" + source +\r
943                           "' expected: '" + level2Expected + "' but got: '" + level2 + "'");\r
944                 } else {\r
945                     logln("Ulocale.canonicalize for: '" + source + "' returned: '" + level2 + "'");\r
946                 }\r
947             } else {\r
948                 logln("ULocale.canonicalize skipped: '" + source + "'");\r
949             }\r
950         }\r
951     }\r
952 \r
953     public void TestGetAvailable(){\r
954         ULocale[] locales = ULocale.getAvailableLocales();\r
955         if(locales.length<10){\r
956             errln("Did not get the correct result from getAvailableLocales");\r
957         }\r
958         if(!locales[locales.length-1].equals("zu_ZA")){\r
959             errln("Did not get the expected result");\r
960         }\r
961     }\r
962 \r
963     public void TestDisplayNames() {\r
964         // consistency check, also check that all data is available\r
965         {\r
966             ULocale[] locales = ULocale.getAvailableLocales();\r
967             for (int i = 0; i < locales.length; ++i) {\r
968                 ULocale l = locales[i];\r
969                 String name = l.getDisplayName();\r
970 \r
971                 logln(l + " --> " + name +\r
972                       ", " + l.getDisplayName(ULocale.GERMAN) +\r
973                       ", " + l.getDisplayName(ULocale.FRANCE));\r
974 \r
975                 String language = l.getDisplayLanguage();\r
976                 String script = l.getDisplayScript();\r
977                 String country = l.getDisplayCountry();\r
978                 String variant = l.getDisplayVariant();\r
979 \r
980                 checkName(name, language, script, country, variant, ULocale.getDefault());\r
981 \r
982                 for (int j = 0; j < locales.length; ++j) {\r
983                     ULocale dl = locales[j];\r
984 \r
985                     name = l.getDisplayName(dl);\r
986                     language = l.getDisplayLanguage(dl);\r
987                     script = l.getDisplayScript(dl);\r
988                     country = l.getDisplayCountry(dl);\r
989                     variant = l.getDisplayVariant(dl);\r
990 \r
991                     if (!checkName(name, language, script, country, variant, dl)) {\r
992                         break;\r
993                     }\r
994                 }\r
995             }\r
996         }\r
997         // spot check\r
998         {\r
999             ULocale[] locales = {\r
1000                 ULocale.US, ULocale.GERMANY, ULocale.FRANCE\r
1001             };\r
1002             String[] names = {\r
1003                 "Chinese (China)", "Chinesisch (China)", "chinois (Chine)"\r
1004             };\r
1005             String[] names2 = {\r
1006                     "Simplified Chinese (China)", "Chinesisch (vereinfacht) (China)", "chinois simplifi\u00E9 (Chine)"\r
1007                 };\r
1008             ULocale locale = new ULocale("zh_CN");\r
1009             ULocale locale2 = new ULocale("zh_Hans_CN");\r
1010             \r
1011             for (int i = 0; i < locales.length; ++i) {\r
1012                 String name = locale.getDisplayName(locales[i]);\r
1013                 if (!names[i].equals(name)) {\r
1014                     errln("expected '" + names[i] + "' but got '" + name + "'");\r
1015                 }\r
1016             }\r
1017             for (int i = 0; i < locales.length; ++i) {\r
1018                 String name = locale2.getDisplayNameWithDialect(locales[i]);\r
1019                 if (!names2[i].equals(name)) {\r
1020                     errln("expected '" + names2[i] + "' but got '" + name + "'");\r
1021                 }\r
1022             }\r
1023         }\r
1024     }\r
1025 \r
1026     private boolean checkName(String name, String language, String script, String country, String variant, ULocale dl) {\r
1027         if (language.length() > 0 && name.indexOf(language) == -1) {\r
1028             errln("loc: " + dl + " name '" + name + "' does not contain language '" + language + "'");\r
1029             return false;\r
1030         }\r
1031         if (script.length() > 0 && name.indexOf(script) == -1) {\r
1032             errln("loc: " + dl + " name '" + name + "' does not contain script '" + script + "'");\r
1033             return false;\r
1034         }\r
1035         if (country.length() > 0 && name.indexOf(country) == -1) {\r
1036             errln("loc: " + dl + " name '" + name + "' does not contain country '" + country + "'");\r
1037             return false;\r
1038         }\r
1039         if (variant.length() > 0 && name.indexOf(variant) == -1) {\r
1040             errln("loc: " + dl + " name '" + name + "' does not contain variant '" + variant + "'");\r
1041             return false;\r
1042         }\r
1043         return true;\r
1044     }\r
1045 \r
1046     public void TestCoverage() {\r
1047         {\r
1048             //Cover displayXXX\r
1049             int i, j;\r
1050             String localeID="zh_CN";\r
1051             String name, language, script, country, variant;\r
1052             logln("Covering APIs with signature displayXXX(String, String)");\r
1053             for (i = 0; i < LOCALE_SIZE; i++) {\r
1054                 //localeID String\r
1055                 String testLocale=(rawData2[NAME][i]);\r
1056 \r
1057                 logln("Testing "+ testLocale+".....");\r
1058                 name = ULocale.getDisplayName(localeID, testLocale);\r
1059                 language = ULocale.getDisplayLanguage(localeID, testLocale);\r
1060                 script = ULocale.getDisplayScript(localeID, testLocale);\r
1061                 country = ULocale.getDisplayCountry(localeID, testLocale);\r
1062                 variant = ULocale.getDisplayVariant(localeID, testLocale);\r
1063 \r
1064                 if (!checkName(name, language, script, country, variant, new ULocale(testLocale))) {\r
1065                     break;\r
1066                 }\r
1067             }\r
1068 \r
1069             logln("Covering APIs with signature displayXXX(String, ULocale)\n");\r
1070             for (j = 0; j < LOCALE_SIZE; j++) {\r
1071                 String testLocale=(rawData2[NAME][j]);\r
1072                 ULocale loc = new ULocale(testLocale);\r
1073 \r
1074                 logln("Testing "+ testLocale+".....");\r
1075                 name = ULocale.getDisplayName(localeID, loc);\r
1076                 language = ULocale.getDisplayLanguage(localeID, loc);\r
1077                 script = ULocale.getDisplayScript(localeID, loc);\r
1078                 country = ULocale.getDisplayCountry(localeID, loc);\r
1079                 variant = ULocale.getDisplayVariant(localeID, loc);\r
1080 \r
1081                 if (!checkName(name, language, script, country, variant, loc)) {\r
1082                     break;\r
1083                 }\r
1084             }\r
1085         }\r
1086         ULocale loc1 = new ULocale("en_US_BROOKLYN");\r
1087         ULocale loc2 = new ULocale("en","US","BROOKLYN");\r
1088         if (!loc2.equals(loc1)){\r
1089             errln("ULocale.ULocale(String a, String b, String c)");\r
1090         }\r
1091         \r
1092         ULocale loc3 = new ULocale("en_US");\r
1093         ULocale loc4 = new ULocale("en","US");\r
1094         if (!loc4.equals(loc3)){\r
1095             errln("ULocale.ULocale(String a, String b)");\r
1096         }\r
1097         \r
1098         ULocale loc5 = (ULocale) loc4.clone();\r
1099         if (!loc5.equals(loc4)){\r
1100             errln("ULocale.clone should get the same ULocale");\r
1101         }\r
1102         ULocale.getISOCountries(); // To check the result ?!\r
1103     }\r
1104 \r
1105     public void TestBamBm() {\r
1106         // "bam" shouldn't be there since the official code is 'bm'\r
1107         String[] isoLanguages = ULocale.getISOLanguages();\r
1108         for (int i = 0; i < isoLanguages.length; ++i) {\r
1109             if ("bam".equals(isoLanguages[i])) {\r
1110                 errln("found bam");\r
1111             }\r
1112             if (i > 0 && isoLanguages[i].compareTo(isoLanguages[i-1]) <= 0) {\r
1113                 errln("language list out of order: '" + isoLanguages[i] + " <= " + isoLanguages[i-1]);\r
1114             }\r
1115         }\r
1116     }\r
1117 \r
1118     public void TestDisplayKeyword() {\r
1119         //prepare testing data\r
1120         initHashtable();\r
1121         String[] data = {"en_US@collation=direct;calendar=islamic-civil",\r
1122              "zh_Hans@collation=pinyin;calendar=chinese",\r
1123              "foo_Bar_BAZ@collation=traditional;calendar=buddhist"};\r
1124 \r
1125         for (int i = 0; i < data.length; i++) {\r
1126             String localeID = data[i];\r
1127             logln("");\r
1128             logln("Testing locale " + localeID + " ...");\r
1129             ULocale loc = new ULocale(localeID);\r
1130 \r
1131             Iterator it = loc.getKeywords();\r
1132             Iterator it2 = ULocale.getKeywords(localeID);\r
1133             //it and it2 are not equal here. No way to verify their equivalence yet.\r
1134             while(it.hasNext()) {\r
1135                 String key = (String)it.next();\r
1136                 String key2 = (String)it2.next();\r
1137                 if (!key.equals(key2)) {\r
1138                     errln("FAIL: static and non-static getKeywords returned different results.");\r
1139                 }\r
1140 \r
1141                 //To verify display of Keyword\r
1142                 // display the above key in English\r
1143                 String s0 = ULocale.getDisplayKeyword(key); //display in default locale\r
1144                 String s1 = ULocale.getDisplayKeyword(key, ULocale.US);\r
1145                 String s2 = ULocale.getDisplayKeyword(key, "en_US");\r
1146                 if (!s1.equals(s2)) {\r
1147                     errln ("FAIL: one of the getDisplayKeyword methods failed.");\r
1148                 }\r
1149                 if (ULocale.getDefault().equals(ULocale.US) && !s1.equals(s0)) {\r
1150                     errln ("FAIL: getDisplayKeyword methods failed for the default locale.");\r
1151                 }\r
1152                 if (!s1.equals(h[0].get(key))) {\r
1153                     warnln("Locale " + localeID + " getDisplayKeyword for key: " + key +\r
1154                           " in English expected \"" + h[0].get(key) + "\" saw \"" + s1 + "\" instead");\r
1155                 } else {\r
1156                     logln("OK: getDisplayKeyword for key: " + key + " in English got " + s1);\r
1157                 }\r
1158 \r
1159                 // display the key in S-Chinese\r
1160                 s1 = ULocale.getDisplayKeyword(key, ULocale.CHINA);\r
1161                 s2 = ULocale.getDisplayKeyword(key, "zh_Hans");\r
1162                 if (!s1.equals(s2)) {\r
1163                     errln ("one of the getDisplayKeyword methods failed.");\r
1164                 }\r
1165                 if (!s1.equals(h[1].get(key))) {\r
1166                     warnln("Locale " + localeID + " getDisplayKeyword for key: " + key +\r
1167                           " in Chinese expected \"" + h[1].get(key) + "\" saw \"" + s1 + "\" instead");\r
1168                 } else {\r
1169                     logln("OK: getDisplayKeyword for key: " + key + " in Chinese got " + s1);\r
1170                 }\r
1171 \r
1172                 //To verify display of Keyword values\r
1173                 String type = loc.getKeywordValue(key);\r
1174                 // display type in English\r
1175                 String ss0 = loc.getDisplayKeywordValue(key);\r
1176                 String ss1 = loc.getDisplayKeywordValue(key, ULocale.US);\r
1177                 String ss2 = ULocale.getDisplayKeywordValue(localeID, key, "en_US");\r
1178                 String ss3 = ULocale.getDisplayKeywordValue(localeID, key, ULocale.US);\r
1179                 if (!ss1.equals(ss2) || !ss1.equals(ss3)) {\r
1180                     errln ("FAIL: one of the getDisplayKeywordValue methods failed.");\r
1181                 }\r
1182                 if (ULocale.getDefault().equals(ULocale.US) && !ss1.equals(ss0)) {\r
1183                     errln ("FAIL: getDisplayKeyword methods failed for the default locale.");\r
1184                 }\r
1185                 if (!ss1.equals(h[0].get(type))) {\r
1186                     warnln(" Locale " + localeID + " getDisplayKeywordValue for key: " + key +\r
1187                           " in English expected \"" + h[0].get(type) + "\" saw \"" + ss1 + "\" instead");\r
1188                 } else {\r
1189                     logln("OK: getDisplayKeywordValue for key: " + key + " in English got " + ss1);\r
1190                 }\r
1191 \r
1192                 // display type in Chinese\r
1193                 ss0 = loc.getDisplayKeywordValue(key);\r
1194                 ss1 = loc.getDisplayKeywordValue(key, ULocale.CHINA);\r
1195                 ss2 = ULocale.getDisplayKeywordValue(localeID, key, "zh_Hans");\r
1196                 ss3 = ULocale.getDisplayKeywordValue(localeID, key, ULocale.CHINA);\r
1197                 if (!ss1.equals(ss2) || !ss1.equals(ss3)) {\r
1198                     warnln ("one of the getDisplayKeywordValue methods failed.");\r
1199                 }\r
1200                 if (!ss1.equals(h[1].get(type))) {\r
1201                     warnln("Locale " + localeID + " getDisplayKeywordValue for key: " + key +\r
1202                           " in Chinese expected \"" + h[1].get(type) + "\" saw \"" + ss1 + "\" instead");\r
1203                 } else {\r
1204                     logln("OK: getDisplayKeywordValue for key: " + key + " in Chinese got " + ss1);\r
1205                 }\r
1206             }\r
1207         }\r
1208     }\r
1209     private void initHashtable() {\r
1210         h[0] = new Hashtable();\r
1211         h[1] = new Hashtable();\r
1212 \r
1213         //display in English\r
1214         h[0].put("collation", "collation");\r
1215         h[0].put("calendar", "calendar");\r
1216         h[0].put("currency", "Currency");\r
1217         h[0].put("phonebook", "Phonebook Order");\r
1218         h[0].put("pinyin", "Simplified Chinese Pinyin Sort Order");\r
1219         h[0].put("traditional", "Traditional Sort Order");\r
1220         h[0].put("stroke", "Stroke Order");\r
1221         h[0].put("direct", "Direct Sort Order");\r
1222         h[0].put("japanese", "Japanese Calendar");\r
1223         h[0].put("buddhist", "Buddhist Calendar");\r
1224         h[0].put("islamic", "Islamic Calendar");\r
1225         h[0].put("islamic-civil", "Islamic-Civil Calendar" );\r
1226         h[0].put("hebrew", "Hebrew Calendar");\r
1227         h[0].put("chinese", "Chinese Calendar");\r
1228         h[0].put("gregorian", "Gregorian Calendar" );\r
1229 \r
1230         //display in S-Chinese\r
1231         h[1].put("collation", "\u5BF9\u7167");\r
1232         h[1].put("calendar", "\u65E5\u5386");\r
1233         h[1].put("currency", "\u8D27\u5E01");\r
1234         h[1].put("direct", "\u987A\u5E8F");\r
1235         h[1].put("phonebook", "\u7535\u8BDD\u7C3F\u987A\u5E8F");\r
1236         h[1].put("pinyin", "\u62FC\u97F3\u987a\u5e8f");\r
1237         h[1].put("stroke", "\u7B14\u5212\u987A\u5E8F");\r
1238         h[1].put("traditional", "\u4F20\u7EDF\u5386\u6CD5");\r
1239         h[1].put("japanese", "\u65E5\u672C\u65E5\u5386");\r
1240         h[1].put("buddhist", "\u4F5B\u6559\u65E5\u5386");\r
1241         h[1].put("islamic", "\u4F0A\u65AF\u5170\u65E5\u5386");\r
1242         h[1].put("islamic-civil", "\u4F0A\u65AF\u5170\u5E0C\u5409\u6765\u5386");\r
1243         h[1].put("hebrew", "\u5E0C\u4F2F\u6765\u65E5\u5386");\r
1244         h[1].put("chinese", "\u519C\u5386");\r
1245         h[1].put("gregorian", "\u516C\u5386");\r
1246     }\r
1247 \r
1248     //Hashtables for storing expected display of keys/types of locale in English and Chinese\r
1249     private static Hashtable[] h = new Hashtable[2];\r
1250     \r
1251     private static final String ACCEPT_LANGUAGE_TESTS[][]  =  {\r
1252     /*#      result  fallback? */\r
1253     /*0*/ { "mt_MT", "false" },\r
1254     /*1*/ { "en", "false" },\r
1255     /*2*/ { "en", "true" }, // fell back from en-zzz to en\r
1256     /*3*/ {  null, "true" },\r
1257     /*4*/ {  "es", "false" }, \r
1258     /*5*/ { "de", "false" }};\r
1259     \r
1260     private static final String ACCEPT_LANGUAGE_HTTP[] = { \r
1261                     /*0*/ "mt-mt, ja;q=0.76, en-us;q=0.95, en;q=0.92, en-gb;q=0.89, fr;q=0.87, iu-ca;q=0.84, iu;q=0.82, ja-jp;q=0.79, mt;q=0.97, de-de;q=0.74, de;q=0.71, es;q=0.68, it-it;q=0.66, it;q=0.63, vi-vn;q=0.61, vi;q=0.58, nl-nl;q=0.55, nl;q=0.53, th-th-traditional;q=.01",\r
1262                     /*1*/ "ja;q=0.5, en;q=0.8, tlh",\r
1263                     /*2*/ "en-zzz, de-lx;q=0.8",\r
1264                     /*3*/ "mga-ie;q=0.9, tlh",\r
1265                     /*4*/ "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+\r
1266                           "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+\r
1267                                "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+\r
1268                                "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+\r
1269                                "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+\r
1270                                "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+\r
1271                                "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+\r
1272                                "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+\r
1273                                "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+\r
1274                                "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, "+\r
1275                                "es",\r
1276                         /*5*/ "de;q=.9, fr;q=.9, xxx-yyy, sr;q=.8"};\r
1277     \r
1278     \r
1279     public void TestAcceptLanguage() {\r
1280         for(int i = 0 ; i < (ACCEPT_LANGUAGE_HTTP.length); i++) {\r
1281             Boolean expectBoolean = new Boolean(ACCEPT_LANGUAGE_TESTS[i][1]);\r
1282             String expectLocale=ACCEPT_LANGUAGE_TESTS[i][0];\r
1283             \r
1284            logln("#" + i + ": expecting: " + expectLocale + " (" + expectBoolean + ")");\r
1285             \r
1286             boolean r[] = { false };\r
1287             ULocale n = ULocale.acceptLanguage(ACCEPT_LANGUAGE_HTTP[i], r);\r
1288             if((n==null)&&(expectLocale!=null)) {\r
1289                 errln("result was null! line #" + i);\r
1290                 continue;\r
1291             }\r
1292             if(((n==null)&&(expectLocale==null)) || (n.toString().equals(expectLocale))) {\r
1293                 logln(" locale: OK." );\r
1294             } else {\r
1295                 errln("expected " + expectLocale + " but got " + n.toString());\r
1296             }\r
1297             if(expectBoolean.equals(new Boolean(r[0]))) {\r
1298                 logln(" bool: OK.");\r
1299             } else {\r
1300                 errln("bool: not OK, was " + new Boolean(r[0]).toString() + " expected " + expectBoolean.toString());\r
1301             }\r
1302         }\r
1303     }\r
1304     \r
1305     private ULocale[] StringToULocaleArray(String acceptLanguageList){\r
1306         //following code is copied from \r
1307         //ULocale.acceptLanguage(String acceptLanguageList, ULocale[] availableLocales, boolean[] fallback)\r
1308         class ULocaleAcceptLanguageQ implements Comparable {\r
1309             private double q;\r
1310             private double serial;\r
1311             public ULocaleAcceptLanguageQ(double theq, int theserial) {\r
1312                 q = theq;\r
1313                 serial = theserial;\r
1314             }\r
1315             public int compareTo(Object o) {\r
1316                 ULocaleAcceptLanguageQ other = (ULocaleAcceptLanguageQ) o;\r
1317                 if(q > other.q) { // reverse - to sort in descending order\r
1318                     return -1;\r
1319                 } else if(q < other.q) {\r
1320                     return 1;\r
1321                 }\r
1322                 if(serial < other.serial) {\r
1323                     return -1;\r
1324                 } else if(serial > other.serial) {\r
1325                     return 1;\r
1326                 } else {\r
1327                     return 0; // same object\r
1328                 }\r
1329             }\r
1330         }\r
1331 \r
1332         // 1st: parse out the acceptLanguageList into an array\r
1333         \r
1334         TreeMap map = new TreeMap();\r
1335         \r
1336         final int l = acceptLanguageList.length();\r
1337         int n;\r
1338         for(n=0;n<l;n++) {\r
1339             int itemEnd = acceptLanguageList.indexOf(',',n);\r
1340             if(itemEnd == -1) {\r
1341                 itemEnd = l;\r
1342             }\r
1343             int paramEnd = acceptLanguageList.indexOf(';',n);\r
1344             double q = 1.0;\r
1345  \r
1346             if((paramEnd != -1) && (paramEnd < itemEnd)) {\r
1347                 /* semicolon (;) is closer than end (,) */\r
1348                 int t = paramEnd + 1;\r
1349                 while(UCharacter.isWhitespace(acceptLanguageList.charAt(t))) {\r
1350                     t++;\r
1351                 }\r
1352                 if(acceptLanguageList.charAt(t)=='q') {\r
1353                     t++;\r
1354                 }\r
1355                 while(UCharacter.isWhitespace(acceptLanguageList.charAt(t))) {\r
1356                     t++;\r
1357                 }\r
1358                 if(acceptLanguageList.charAt(t)=='=') {\r
1359                     t++;\r
1360                 }\r
1361                 while(UCharacter.isWhitespace(acceptLanguageList.charAt(t))) {\r
1362                     t++;\r
1363                 }\r
1364                 try {\r
1365                     String val = acceptLanguageList.substring(t,itemEnd).trim();\r
1366                     q = Double.parseDouble(val);\r
1367                 } catch (NumberFormatException nfe) {\r
1368                     q = 1.0;\r
1369                 }\r
1370             } else {\r
1371                 q = 1.0; //default\r
1372                 paramEnd = itemEnd;\r
1373             }\r
1374 \r
1375             String loc = acceptLanguageList.substring(n,paramEnd).trim();\r
1376             int serial = map.size();\r
1377             ULocaleAcceptLanguageQ entry = new ULocaleAcceptLanguageQ(q,serial);\r
1378             map.put(entry, new ULocale(ULocale.canonicalize(loc))); // sort in reverse order..   1.0, 0.9, 0.8 .. etc\r
1379             n = itemEnd; // get next item. (n++ will skip over delimiter)\r
1380         }\r
1381         \r
1382         // 2. pull out the map \r
1383         ULocale acceptList[] = (ULocale[])map.values().toArray(new ULocale[map.size()]);\r
1384         return acceptList;\r
1385     }\r
1386     \r
1387     public void TestAcceptLanguage2() {\r
1388         for(int i = 0 ; i < (ACCEPT_LANGUAGE_HTTP.length); i++) {\r
1389             Boolean expectBoolean = new Boolean(ACCEPT_LANGUAGE_TESTS[i][1]);\r
1390             String expectLocale=ACCEPT_LANGUAGE_TESTS[i][0];\r
1391             \r
1392            logln("#" + i + ": expecting: " + expectLocale + " (" + expectBoolean + ")");\r
1393             \r
1394             boolean r[] = { false };\r
1395             ULocale n = ULocale.acceptLanguage(StringToULocaleArray(ACCEPT_LANGUAGE_HTTP[i]), r);\r
1396             if((n==null)&&(expectLocale!=null)) {\r
1397                 errln("result was null! line #" + i);\r
1398                 continue;\r
1399             }\r
1400             if(((n==null)&&(expectLocale==null)) || (n.toString().equals(expectLocale))) {\r
1401                 logln(" locale: OK." );\r
1402             } else {\r
1403                 errln("expected " + expectLocale + " but got " + n.toString());\r
1404             }\r
1405             if(expectBoolean.equals(new Boolean(r[0]))) {\r
1406                 logln(" bool: OK.");\r
1407             } else {\r
1408                 errln("bool: not OK, was " + new Boolean(r[0]).toString() + " expected " + expectBoolean.toString());\r
1409             }\r
1410         }\r
1411     }\r
1412 \r
1413     public void TestOrientation() {\r
1414         {\r
1415             String toTest [][] = {\r
1416                 { "ar", "right-to-left", "top-to-bottom" },\r
1417                 { "ar_Arab", "right-to-left", "top-to-bottom" },\r
1418                 { "fa", "right-to-left", "top-to-bottom" },\r
1419                 { "he", "right-to-left", "top-to-bottom" },\r
1420                 { "ps", "right-to-left", "top-to-bottom" },\r
1421                 { "ur", "right-to-left", "top-to-bottom" },\r
1422                 { "en", "left-to-right", "top-to-bottom" }\r
1423             };\r
1424 \r
1425             for (int i = 0; i < toTest.length; ++i) {\r
1426                 ULocale loc = new ULocale(toTest[i][0]);\r
1427                 String co = loc.getCharacterOrientation();\r
1428                 String lo = loc.getLineOrientation();\r
1429                 if (!co.equals(toTest[i][1])) {\r
1430                     errln("Locale \"" + toTest[i][0] + "\" should have \"" + toTest[i][1] + "\" character orientation, but got \'" + co + "\"");\r
1431                 }\r
1432                 else if (!lo.equals(toTest[i][2])) {\r
1433                     errln("Locale \"" + toTest[i][0] + "\" should have \"" + toTest[i][2] + "\" line orientation, but got \'" + lo + "\"");\r
1434                 }\r
1435             }\r
1436         }\r
1437     }\r
1438 \r
1439     public void TestJB3962(){\r
1440         ULocale loc = new ULocale("de_CH");\r
1441         String disp = loc.getDisplayName(ULocale.GERMAN);\r
1442         if(!disp.equals("Deutsch (Schweiz)")){\r
1443             errln("Did not get the expected display name for de_CH locale. Got: "+ prettify(disp));\r
1444         }\r
1445     }\r
1446 \r
1447     public void TestAddLikelySubtags() {\r
1448         String[][] data = {\r
1449             {"en", "en_Latn_US"},\r
1450             {"en_US_BOSTON", "en_Latn_US_BOSTON"},\r
1451             {"th@calendar=buddhist", "th_Thai_TH@calendar=buddhist"},\r
1452             {"ar_ZZ", "ar_Arab_EG"},\r
1453             {"zh", "zh_Hans_CN"},\r
1454             {"zh_TW", "zh_Hant_TW"},\r
1455             {"zh_HK", "zh_Hant_HK"},\r
1456             {"zh_Hant", "zh_Hant_TW"},\r
1457             {"zh_Zzzz_CN", "zh_Hans_CN"},\r
1458             {"und_US", "en_Latn_US"},\r
1459             {"und_HK", "zh_Hant_HK"},\r
1460             /* Not yet implemented\r
1461             {"art_lojban", "arg_lojban"},\r
1462             {"zh_cmn_Hans", "zh_cmn_Hans"},\r
1463             */\r
1464         };\r
1465         for (int i = 0; i < data.length; i++) {\r
1466             ULocale org = new ULocale(data[i][0]);\r
1467             ULocale res = ULocale.addLikelySubtags(org);\r
1468             if (!res.toString().equals(data[i][1])) {\r
1469                 errln("Original: " + data[i][0] + " Expected: " + data[i][1] + " - but got " + res.toString());\r
1470             }\r
1471         }\r
1472 \r
1473         String[][] basic_maximize_data = {\r
1474             {\r
1475                 "zu_Zzzz_Zz",\r
1476                 "zu_Latn_ZA",\r
1477             }, {\r
1478                 "zu_Zz",\r
1479                 "zu_Latn_ZA"\r
1480             }, {\r
1481                 "en_Zz",\r
1482                 "en_Latn_US"\r
1483             }, {\r
1484                 "en_Kore",\r
1485                 "en_Kore_US"\r
1486             }, {\r
1487                 "en_Kore_Zz",\r
1488                 "en_Kore_US"\r
1489             }, {\r
1490                 "en_Kore_ZA",\r
1491                 "en_Kore_ZA"\r
1492             }, {\r
1493                 "en_Kore_ZA_POSIX",\r
1494                 "en_Kore_ZA_POSIX"\r
1495             }, {\r
1496                 "en_Gujr",\r
1497                 "en_Gujr_US"\r
1498             }, {\r
1499                 "en_ZA",\r
1500                 "en_Latn_ZA"\r
1501             }, {\r
1502                 "en_Gujr_Zz",\r
1503                 "en_Gujr_US"\r
1504             }, {\r
1505                 "en_Gujr_ZA",\r
1506                 "en_Gujr_ZA"\r
1507             }, {\r
1508                 "en_Gujr_ZA_POSIX",\r
1509                 "en_Gujr_ZA_POSIX"\r
1510             }, {\r
1511                 "en_US_POSIX_1901",\r
1512                 "en_Latn_US_POSIX_1901"\r
1513             }, {\r
1514                 "en_Latn__POSIX_1901",\r
1515                 "en_Latn_US_POSIX_1901"\r
1516             }, {\r
1517                 "en__POSIX_1901",\r
1518                 "en_Latn_US_POSIX_1901"\r
1519             }, {\r
1520                 "de__POSIX_1901",\r
1521                 "de_Latn_DE_POSIX_1901"\r
1522             }, {\r
1523                 "zzz",\r
1524                 ""\r
1525             }\r
1526         };\r
1527 \r
1528         for (int i = 0; i < basic_maximize_data.length; i++) {\r
1529             ULocale org = new ULocale(basic_maximize_data[i][0]);\r
1530             ULocale res = ULocale.addLikelySubtags(org);\r
1531             String exp = basic_maximize_data[i][1];\r
1532             if (exp.length() == 0) {\r
1533                 if (!org.equals(res)) {\r
1534                     errln("Original: " + basic_maximize_data[i][0] + " expected: " + exp + " - but got " + res.toString());\r
1535                 }\r
1536             }\r
1537             else if (!res.toString().equals(exp)) {\r
1538                 errln("Original: " + basic_maximize_data[i][0] + " expected: " + exp + " - but got " + res.toString());\r
1539             }\r
1540         }\r
1541 \r
1542         String[][] basic_minimize_data = {\r
1543             {\r
1544                 "en_Latn_US",\r
1545                 "en"\r
1546             }, {\r
1547                 "en_Latn_US_POSIX_1901",\r
1548                 "en__POSIX_1901"\r
1549             }, {\r
1550                 "en_Zzzz_US_POSIX_1901",\r
1551                 "en__POSIX_1901"\r
1552             }, {\r
1553                 "de_Latn_DE_POSIX_1901",\r
1554                 "de__POSIX_1901"\r
1555             }, {\r
1556                 "und",\r
1557                 ""\r
1558             }\r
1559         };\r
1560 \r
1561         for (int i = 0; i < basic_minimize_data.length; i++) {\r
1562             ULocale org = new ULocale(basic_minimize_data[i][0]);\r
1563             ULocale res = ULocale.minimizeSubtags(org);\r
1564             String exp = basic_minimize_data[i][1];\r
1565             if (exp.length() == 0) {\r
1566                 if (!org.equals(res)) {\r
1567                     errln("Original: " + basic_minimize_data[i][0] + " expected: " + exp + " - but got " + res.toString());\r
1568                 }\r
1569             }\r
1570             else if (!res.toString().equals(exp)) {\r
1571                 errln("Original: " + basic_minimize_data[i][0] + " expected: " + exp + " - but got " + res.toString());\r
1572             }\r
1573         }\r
1574 \r
1575         String[][] full_data = {\r
1576             {\r
1577                 /*   "FROM", */\r
1578                 /*   "ADD-LIKELY", */\r
1579                 /*   "REMOVE-LIKELY" */\r
1580                 /* }, { */\r
1581                 "aa",\r
1582                 "aa_Latn_ET",\r
1583                 "aa"\r
1584             }, {\r
1585                 "af",\r
1586                 "af_Latn_ZA",\r
1587                 "af"\r
1588             }, {\r
1589                 "ak",\r
1590                 "ak_Latn_GH",\r
1591                 "ak"\r
1592             }, {\r
1593                 "am",\r
1594                 "am_Ethi_ET",\r
1595                 "am"\r
1596             }, {\r
1597                 "ar",\r
1598                 "ar_Arab_EG",\r
1599                 "ar"\r
1600             }, {\r
1601                 "as",\r
1602                 "as_Beng_IN",\r
1603                 "as"\r
1604             }, {\r
1605                 "az",\r
1606                 "az_Latn_AZ",\r
1607                 "az"\r
1608             }, {\r
1609                 "be",\r
1610                 "be_Cyrl_BY",\r
1611                 "be"\r
1612             }, {\r
1613                 "bg",\r
1614                 "bg_Cyrl_BG",\r
1615                 "bg"\r
1616             }, {\r
1617                 "bn",\r
1618                 "bn_Beng_BD",\r
1619                 "bn"\r
1620             }, {\r
1621                 "bo",\r
1622                 "bo_Tibt_CN",\r
1623                 "bo"\r
1624             }, {\r
1625                 "bs",\r
1626                 "bs_Latn_BA",\r
1627                 "bs"\r
1628             }, {\r
1629                 "ca",\r
1630                 "ca_Latn_ES",\r
1631                 "ca"\r
1632             }, {\r
1633                 "ch",\r
1634                 "ch_Latn_GU",\r
1635                 "ch"\r
1636             }, {\r
1637                 "chk",\r
1638                 "chk_Latn_FM",\r
1639                 "chk"\r
1640             }, {\r
1641                 "cs",\r
1642                 "cs_Latn_CZ",\r
1643                 "cs"\r
1644             }, {\r
1645                 "cy",\r
1646                 "cy_Latn_GB",\r
1647                 "cy"\r
1648             }, {\r
1649                 "da",\r
1650                 "da_Latn_DK",\r
1651                 "da"\r
1652             }, {\r
1653                 "de",\r
1654                 "de_Latn_DE",\r
1655                 "de"\r
1656             }, {\r
1657                 "dv",\r
1658                 "dv_Thaa_MV",\r
1659                 "dv"\r
1660             }, {\r
1661                 "dz",\r
1662                 "dz_Tibt_BT",\r
1663                 "dz"\r
1664             }, {\r
1665                 "ee",\r
1666                 "ee_Latn_GH",\r
1667                 "ee"\r
1668             }, {\r
1669                 "el",\r
1670                 "el_Grek_GR",\r
1671                 "el"\r
1672             }, {\r
1673                 "en",\r
1674                 "en_Latn_US",\r
1675                 "en"\r
1676             }, {\r
1677                 "es",\r
1678                 "es_Latn_ES",\r
1679                 "es"\r
1680             }, {\r
1681                 "et",\r
1682                 "et_Latn_EE",\r
1683                 "et"\r
1684             }, {\r
1685                 "eu",\r
1686                 "eu_Latn_ES",\r
1687                 "eu"\r
1688             }, {\r
1689                 "fa",\r
1690                 "fa_Arab_IR",\r
1691                 "fa"\r
1692             }, {\r
1693                 "fi",\r
1694                 "fi_Latn_FI",\r
1695                 "fi"\r
1696             }, {\r
1697                 "fil",\r
1698                 "fil_Latn_PH",\r
1699                 "fil"\r
1700             }, {\r
1701                 "fj",\r
1702                 "fj_Latn_FJ",\r
1703                 "fj"\r
1704             }, {\r
1705                 "fo",\r
1706                 "fo_Latn_FO",\r
1707                 "fo"\r
1708             }, {\r
1709                 "fr",\r
1710                 "fr_Latn_FR",\r
1711                 "fr"\r
1712             }, {\r
1713                 "fur",\r
1714                 "fur_Latn_IT",\r
1715                 "fur"\r
1716             }, {\r
1717                 "ga",\r
1718                 "ga_Latn_IE",\r
1719                 "ga"\r
1720             }, {\r
1721                 "gaa",\r
1722                 "gaa_Latn_GH",\r
1723                 "gaa"\r
1724             }, {\r
1725                 "gl",\r
1726                 "gl_Latn_ES",\r
1727                 "gl"\r
1728             }, {\r
1729                 "gn",\r
1730                 "gn_Latn_PY",\r
1731                 "gn"\r
1732             }, {\r
1733                 "gu",\r
1734                 "gu_Gujr_IN",\r
1735                 "gu"\r
1736             }, {\r
1737                 "ha",\r
1738                 "ha_Latn_NG",\r
1739                 "ha"\r
1740             }, {\r
1741                 "haw",\r
1742                 "haw_Latn_US",\r
1743                 "haw"\r
1744             }, {\r
1745                 "he",\r
1746                 "he_Hebr_IL",\r
1747                 "he"\r
1748             }, {\r
1749                 "hi",\r
1750                 "hi_Deva_IN",\r
1751                 "hi"\r
1752             }, {\r
1753                 "hr",\r
1754                 "hr_Latn_HR",\r
1755                 "hr"\r
1756             }, {\r
1757                 "ht",\r
1758                 "ht_Latn_HT",\r
1759                 "ht"\r
1760             }, {\r
1761                 "hu",\r
1762                 "hu_Latn_HU",\r
1763                 "hu"\r
1764             }, {\r
1765                 "hy",\r
1766                 "hy_Armn_AM",\r
1767                 "hy"\r
1768             }, {\r
1769                 "id",\r
1770                 "id_Latn_ID",\r
1771                 "id"\r
1772             }, {\r
1773                 "ig",\r
1774                 "ig_Latn_NG",\r
1775                 "ig"\r
1776             }, {\r
1777                 "ii",\r
1778                 "ii_Yiii_CN",\r
1779                 "ii"\r
1780             }, {\r
1781                 "is",\r
1782                 "is_Latn_IS",\r
1783                 "is"\r
1784             }, {\r
1785                 "it",\r
1786                 "it_Latn_IT",\r
1787                 "it"\r
1788             }, {\r
1789                 "ja",\r
1790                 "ja_Jpan_JP",\r
1791                 "ja"\r
1792             }, {\r
1793                 "ka",\r
1794                 "ka_Geor_GE",\r
1795                 "ka"\r
1796             }, {\r
1797                 "kaj",\r
1798                 "kaj_Latn_NG",\r
1799                 "kaj"\r
1800             }, {\r
1801                 "kam",\r
1802                 "kam_Latn_KE",\r
1803                 "kam"\r
1804             }, {\r
1805                 "kk",\r
1806                 "kk_Cyrl_KZ",\r
1807                 "kk"\r
1808             }, {\r
1809                 "kl",\r
1810                 "kl_Latn_GL",\r
1811                 "kl"\r
1812             }, {\r
1813                 "km",\r
1814                 "km_Khmr_KH",\r
1815                 "km"\r
1816             }, {\r
1817                 "kn",\r
1818                 "kn_Knda_IN",\r
1819                 "kn"\r
1820             }, {\r
1821                 "ko",\r
1822                 "ko_Kore_KR",\r
1823                 "ko"\r
1824             }, {\r
1825                 "kok",\r
1826                 "kok_Deva_IN",\r
1827                 "kok"\r
1828             }, {\r
1829                 "kpe",\r
1830                 "kpe_Latn_LR",\r
1831                 "kpe"\r
1832             }, {\r
1833                 "ku",\r
1834                 "ku_Arab_IQ",\r
1835                 "ku"\r
1836             }, {\r
1837                 "ky",\r
1838                 "ky_Cyrl_KG",\r
1839                 "ky"\r
1840             }, {\r
1841                 "la",\r
1842                 "la_Latn_VA",\r
1843                 "la"\r
1844             }, {\r
1845                 "ln",\r
1846                 "ln_Latn_CD",\r
1847                 "ln"\r
1848             }, {\r
1849                 "lo",\r
1850                 "lo_Laoo_LA",\r
1851                 "lo"\r
1852             }, {\r
1853                 "lt",\r
1854                 "lt_Latn_LT",\r
1855                 "lt"\r
1856             }, {\r
1857                 "lv",\r
1858                 "lv_Latn_LV",\r
1859                 "lv"\r
1860             }, {\r
1861                 "mg",\r
1862                 "mg_Latn_MG",\r
1863                 "mg"\r
1864             }, {\r
1865                 "mh",\r
1866                 "mh_Latn_MH",\r
1867                 "mh"\r
1868             }, {\r
1869                 "mk",\r
1870                 "mk_Cyrl_MK",\r
1871                 "mk"\r
1872             }, {\r
1873                 "ml",\r
1874                 "ml_Mlym_IN",\r
1875                 "ml"\r
1876             }, {\r
1877                 "mn",\r
1878                 "mn_Cyrl_MN",\r
1879                 "mn"\r
1880             }, {\r
1881                 "mr",\r
1882                 "mr_Deva_IN",\r
1883                 "mr"\r
1884             }, {\r
1885                 "ms",\r
1886                 "ms_Latn_MY",\r
1887                 "ms"\r
1888             }, {\r
1889                 "mt",\r
1890                 "mt_Latn_MT",\r
1891                 "mt"\r
1892             }, {\r
1893                 "my",\r
1894                 "my_Mymr_MM",\r
1895                 "my"\r
1896             }, {\r
1897                 "na",\r
1898                 "na_Latn_NR",\r
1899                 "na"\r
1900             }, {\r
1901                 "ne",\r
1902                 "ne_Deva_NP",\r
1903                 "ne"\r
1904             }, {\r
1905                 "niu",\r
1906                 "niu_Latn_NU",\r
1907                 "niu"\r
1908             }, {\r
1909                 "nl",\r
1910                 "nl_Latn_NL",\r
1911                 "nl"\r
1912             }, {\r
1913                 "nn",\r
1914                 "nn_Latn_NO",\r
1915                 "nn"\r
1916             }, {\r
1917                 "nr",\r
1918                 "nr_Latn_ZA",\r
1919                 "nr"\r
1920             }, {\r
1921                 "nso",\r
1922                 "nso_Latn_ZA",\r
1923                 "nso"\r
1924             }, {\r
1925                 "om",\r
1926                 "om_Latn_ET",\r
1927                 "om"\r
1928             }, {\r
1929                 "or",\r
1930                 "or_Orya_IN",\r
1931                 "or"\r
1932             }, {\r
1933                 "pa",\r
1934                 "pa_Guru_IN",\r
1935                 "pa"\r
1936             }, {\r
1937                 "pa_Arab",\r
1938                 "pa_Arab_PK",\r
1939                 "pa_PK"\r
1940             }, {\r
1941                 "pa_PK",\r
1942                 "pa_Arab_PK",\r
1943                 "pa_PK"\r
1944             }, {\r
1945                 "pap",\r
1946                 "pap_Latn_AN",\r
1947                 "pap"\r
1948             }, {\r
1949                 "pau",\r
1950                 "pau_Latn_PW",\r
1951                 "pau"\r
1952             }, {\r
1953                 "pl",\r
1954                 "pl_Latn_PL",\r
1955                 "pl"\r
1956             }, {\r
1957                 "ps",\r
1958                 "ps_Arab_AF",\r
1959                 "ps"\r
1960             }, {\r
1961                 "pt",\r
1962                 "pt_Latn_BR",\r
1963                 "pt"\r
1964             }, {\r
1965                 "rn",\r
1966                 "rn_Latn_BI",\r
1967                 "rn"\r
1968             }, {\r
1969                 "ro",\r
1970                 "ro_Latn_RO",\r
1971                 "ro"\r
1972             }, {\r
1973                 "ru",\r
1974                 "ru_Cyrl_RU",\r
1975                 "ru"\r
1976             }, {\r
1977                 "rw",\r
1978                 "rw_Latn_RW",\r
1979                 "rw"\r
1980             }, {\r
1981                 "sa",\r
1982                 "sa_Deva_IN",\r
1983                 "sa"\r
1984             }, {\r
1985                 "se",\r
1986                 "se_Latn_NO",\r
1987                 "se"\r
1988             }, {\r
1989                 "sg",\r
1990                 "sg_Latn_CF",\r
1991                 "sg"\r
1992             }, {\r
1993                 "si",\r
1994                 "si_Sinh_LK",\r
1995                 "si"\r
1996             }, {\r
1997                 "sid",\r
1998                 "sid_Latn_ET",\r
1999                 "sid"\r
2000             }, {\r
2001                 "sk",\r
2002                 "sk_Latn_SK",\r
2003                 "sk"\r
2004             }, {\r
2005                 "sl",\r
2006                 "sl_Latn_SI",\r
2007                 "sl"\r
2008             }, {\r
2009                 "sm",\r
2010                 "sm_Latn_WS",\r
2011                 "sm"\r
2012             }, {\r
2013                 "so",\r
2014                 "so_Latn_SO",\r
2015                 "so"\r
2016             }, {\r
2017                 "sq",\r
2018                 "sq_Latn_AL",\r
2019                 "sq"\r
2020             }, {\r
2021                 "sr",\r
2022                 "sr_Cyrl_RS",\r
2023                 "sr"\r
2024             }, {\r
2025                 "ss",\r
2026                 "ss_Latn_ZA",\r
2027                 "ss"\r
2028             }, {\r
2029                 "st",\r
2030                 "st_Latn_ZA",\r
2031                 "st"\r
2032             }, {\r
2033                 "sv",\r
2034                 "sv_Latn_SE",\r
2035                 "sv"\r
2036             }, {\r
2037                 "sw",\r
2038                 "sw_Latn_TZ",\r
2039                 "sw"\r
2040             }, {\r
2041                 "ta",\r
2042                 "ta_Taml_IN",\r
2043                 "ta"\r
2044             }, {\r
2045                 "te",\r
2046                 "te_Telu_IN",\r
2047                 "te"\r
2048             }, {\r
2049                 "tet",\r
2050                 "tet_Latn_TL",\r
2051                 "tet"\r
2052             }, {\r
2053                 "tg",\r
2054                 "tg_Cyrl_TJ",\r
2055                 "tg"\r
2056             }, {\r
2057                 "th",\r
2058                 "th_Thai_TH",\r
2059                 "th"\r
2060             }, {\r
2061                 "ti",\r
2062                 "ti_Ethi_ET",\r
2063                 "ti"\r
2064             }, {\r
2065                 "tig",\r
2066                 "tig_Ethi_ER",\r
2067                 "tig"\r
2068             }, {\r
2069                 "tk",\r
2070                 "tk_Latn_TM",\r
2071                 "tk"\r
2072             }, {\r
2073                 "tkl",\r
2074                 "tkl_Latn_TK",\r
2075                 "tkl"\r
2076             }, {\r
2077                 "tn",\r
2078                 "tn_Latn_ZA",\r
2079                 "tn"\r
2080             }, {\r
2081                 "to",\r
2082                 "to_Latn_TO",\r
2083                 "to"\r
2084             }, {\r
2085                 "tpi",\r
2086                 "tpi_Latn_PG",\r
2087                 "tpi"\r
2088             }, {\r
2089                 "tr",\r
2090                 "tr_Latn_TR",\r
2091                 "tr"\r
2092             }, {\r
2093                 "ts",\r
2094                 "ts_Latn_ZA",\r
2095                 "ts"\r
2096             }, {\r
2097                 "tt",\r
2098                 "tt_Cyrl_RU",\r
2099                 "tt"\r
2100             }, {\r
2101                 "tvl",\r
2102                 "tvl_Latn_TV",\r
2103                 "tvl"\r
2104             }, {\r
2105                 "ty",\r
2106                 "ty_Latn_PF",\r
2107                 "ty"\r
2108             }, {\r
2109                 "uk",\r
2110                 "uk_Cyrl_UA",\r
2111                 "uk"\r
2112             }, {\r
2113                 "und",\r
2114                 "en_Latn_US",\r
2115                 "en"\r
2116             }, {\r
2117                 "und_AD",\r
2118                 "ca_Latn_AD",\r
2119                 "ca_AD"\r
2120             }, {\r
2121                 "und_AE",\r
2122                 "ar_Arab_AE",\r
2123                 "ar_AE"\r
2124             }, {\r
2125                 "und_AF",\r
2126                 "fa_Arab_AF",\r
2127                 "fa_AF"\r
2128             }, {\r
2129                 "und_AL",\r
2130                 "sq_Latn_AL",\r
2131                 "sq"\r
2132             }, {\r
2133                 "und_AM",\r
2134                 "hy_Armn_AM",\r
2135                 "hy"\r
2136             }, {\r
2137                 "und_AN",\r
2138                 "pap_Latn_AN",\r
2139                 "pap"\r
2140             }, {\r
2141                 "und_AO",\r
2142                 "pt_Latn_AO",\r
2143                 "pt_AO"\r
2144             }, {\r
2145                 "und_AR",\r
2146                 "es_Latn_AR",\r
2147                 "es_AR"\r
2148             }, {\r
2149                 "und_AS",\r
2150                 "sm_Latn_AS",\r
2151                 "sm_AS"\r
2152             }, {\r
2153                 "und_AT",\r
2154                 "de_Latn_AT",\r
2155                 "de_AT"\r
2156             }, {\r
2157                 "und_AW",\r
2158                 "nl_Latn_AW",\r
2159                 "nl_AW"\r
2160             }, {\r
2161                 "und_AX",\r
2162                 "sv_Latn_AX",\r
2163                 "sv_AX"\r
2164             }, {\r
2165                 "und_AZ",\r
2166                 "az_Latn_AZ",\r
2167                 "az"\r
2168             }, {\r
2169                 "und_Arab",\r
2170                 "ar_Arab_EG",\r
2171                 "ar"\r
2172             }, {\r
2173                 "und_Arab_IN",\r
2174                 "ur_Arab_IN",\r
2175                 "ur_IN"\r
2176             }, {\r
2177                 "und_Arab_PK",\r
2178                 "ur_Arab_PK",\r
2179                 "ur"\r
2180             }, {\r
2181                 "und_Arab_SN",\r
2182                 "ar_Arab_SN",\r
2183                 "ar_SN"\r
2184             }, {\r
2185                 "und_Armn",\r
2186                 "hy_Armn_AM",\r
2187                 "hy"\r
2188             }, {\r
2189                 "und_BA",\r
2190                 "bs_Latn_BA",\r
2191                 "bs"\r
2192             }, {\r
2193                 "und_BD",\r
2194                 "bn_Beng_BD",\r
2195                 "bn"\r
2196             }, {\r
2197                 "und_BE",\r
2198                 "nl_Latn_BE",\r
2199                 "nl_BE"\r
2200             }, {\r
2201                 "und_BF",\r
2202                 "fr_Latn_BF",\r
2203                 "fr_BF"\r
2204             }, {\r
2205                 "und_BG",\r
2206                 "bg_Cyrl_BG",\r
2207                 "bg"\r
2208             }, {\r
2209                 "und_BH",\r
2210                 "ar_Arab_BH",\r
2211                 "ar_BH"\r
2212             }, {\r
2213                 "und_BI",\r
2214                 "rn_Latn_BI",\r
2215                 "rn"\r
2216             }, {\r
2217                 "und_BJ",\r
2218                 "fr_Latn_BJ",\r
2219                 "fr_BJ"\r
2220             }, {\r
2221                 "und_BN",\r
2222                 "ms_Latn_BN",\r
2223                 "ms_BN"\r
2224             }, {\r
2225                 "und_BO",\r
2226                 "es_Latn_BO",\r
2227                 "es_BO"\r
2228             }, {\r
2229                 "und_BR",\r
2230                 "pt_Latn_BR",\r
2231                 "pt"\r
2232             }, {\r
2233                 "und_BT",\r
2234                 "dz_Tibt_BT",\r
2235                 "dz"\r
2236             }, {\r
2237                 "und_BY",\r
2238                 "be_Cyrl_BY",\r
2239                 "be"\r
2240             }, {\r
2241                 "und_Beng",\r
2242                 "bn_Beng_BD",\r
2243                 "bn"\r
2244             }, {\r
2245                 "und_Beng_IN",\r
2246                 "bn_Beng_IN",\r
2247                 "bn_IN"\r
2248             }, {\r
2249                 "und_CD",\r
2250                 "sw_Latn_CD",\r
2251                 "sw_CD"\r
2252             }, {\r
2253                 "und_CF",\r
2254                 "fr_Latn_CF",\r
2255                 "fr_CF"\r
2256             }, {\r
2257                 "und_CG",\r
2258                 "fr_Latn_CG",\r
2259                 "fr_CG"\r
2260             }, {\r
2261                 "und_CH",\r
2262                 "de_Latn_CH",\r
2263                 "de_CH"\r
2264             }, {\r
2265                 "und_CI",\r
2266                 "fr_Latn_CI",\r
2267                 "fr_CI"\r
2268             }, {\r
2269                 "und_CL",\r
2270                 "es_Latn_CL",\r
2271                 "es_CL"\r
2272             }, {\r
2273                 "und_CM",\r
2274                 "fr_Latn_CM",\r
2275                 "fr_CM"\r
2276             }, {\r
2277                 "und_CN",\r
2278                 "zh_Hans_CN",\r
2279                 "zh"\r
2280             }, {\r
2281                 "und_CO",\r
2282                 "es_Latn_CO",\r
2283                 "es_CO"\r
2284             }, {\r
2285                 "und_CR",\r
2286                 "es_Latn_CR",\r
2287                 "es_CR"\r
2288             }, {\r
2289                 "und_CU",\r
2290                 "es_Latn_CU",\r
2291                 "es_CU"\r
2292             }, {\r
2293                 "und_CV",\r
2294                 "pt_Latn_CV",\r
2295                 "pt_CV"\r
2296             }, {\r
2297                 "und_CY",\r
2298                 "el_Grek_CY",\r
2299                 "el_CY"\r
2300             }, {\r
2301                 "und_CZ",\r
2302                 "cs_Latn_CZ",\r
2303                 "cs"\r
2304             }, {\r
2305                 "und_Cyrl",\r
2306                 "ru_Cyrl_RU",\r
2307                 "ru"\r
2308             }, {\r
2309                 "und_Cyrl_KZ",\r
2310                 "ru_Cyrl_KZ",\r
2311                 "ru_KZ"\r
2312             }, {\r
2313                 "und_DE",\r
2314                 "de_Latn_DE",\r
2315                 "de"\r
2316             }, {\r
2317                 "und_DJ",\r
2318                 "aa_Latn_DJ",\r
2319                 "aa_DJ"\r
2320             }, {\r
2321                 "und_DK",\r
2322                 "da_Latn_DK",\r
2323                 "da"\r
2324             }, {\r
2325                 "und_DO",\r
2326                 "es_Latn_DO",\r
2327                 "es_DO"\r
2328             }, {\r
2329                 "und_DZ",\r
2330                 "ar_Arab_DZ",\r
2331                 "ar_DZ"\r
2332             }, {\r
2333                 "und_Deva",\r
2334                 "hi_Deva_IN",\r
2335                 "hi"\r
2336             }, {\r
2337                 "und_EC",\r
2338                 "es_Latn_EC",\r
2339                 "es_EC"\r
2340             }, {\r
2341                 "und_EE",\r
2342                 "et_Latn_EE",\r
2343                 "et"\r
2344             }, {\r
2345                 "und_EG",\r
2346                 "ar_Arab_EG",\r
2347                 "ar"\r
2348             }, {\r
2349                 "und_EH",\r
2350                 "ar_Arab_EH",\r
2351                 "ar_EH"\r
2352             }, {\r
2353                 "und_ER",\r
2354                 "ti_Ethi_ER",\r
2355                 "ti_ER"\r
2356             }, {\r
2357                 "und_ES",\r
2358                 "es_Latn_ES",\r
2359                 "es"\r
2360             }, {\r
2361                 "und_ET",\r
2362                 "en_Latn_ET",\r
2363                 "en_ET"\r
2364             }, {\r
2365                 "und_Ethi",\r
2366                 "am_Ethi_ET",\r
2367                 "am"\r
2368             }, {\r
2369                 "und_Ethi_ER",\r
2370                 "am_Ethi_ER",\r
2371                 "am_ER"\r
2372             }, {\r
2373                 "und_FI",\r
2374                 "fi_Latn_FI",\r
2375                 "fi"\r
2376             }, {\r
2377                 "und_FM",\r
2378                 "chk_Latn_FM",\r
2379                 "chk"\r
2380             }, {\r
2381                 "und_FO",\r
2382                 "fo_Latn_FO",\r
2383                 "fo"\r
2384             }, {\r
2385                 "und_FR",\r
2386                 "fr_Latn_FR",\r
2387                 "fr"\r
2388             }, {\r
2389                 "und_GA",\r
2390                 "fr_Latn_GA",\r
2391                 "fr_GA"\r
2392             }, {\r
2393                 "und_GE",\r
2394                 "ka_Geor_GE",\r
2395                 "ka"\r
2396             }, {\r
2397                 "und_GF",\r
2398                 "fr_Latn_GF",\r
2399                 "fr_GF"\r
2400             }, {\r
2401                 "und_GL",\r
2402                 "kl_Latn_GL",\r
2403                 "kl"\r
2404             }, {\r
2405                 "und_GN",\r
2406                 "fr_Latn_GN",\r
2407                 "fr_GN"\r
2408             }, {\r
2409                 "und_GP",\r
2410                 "fr_Latn_GP",\r
2411                 "fr_GP"\r
2412             }, {\r
2413                 "und_GQ",\r
2414                 "es_Latn_GQ",\r
2415                 "es_GQ"\r
2416             }, {\r
2417                 "und_GR",\r
2418                 "el_Grek_GR",\r
2419                 "el"\r
2420             }, {\r
2421                 "und_GT",\r
2422                 "es_Latn_GT",\r
2423                 "es_GT"\r
2424             }, {\r
2425                 "und_GU",\r
2426                 "en_Latn_GU",\r
2427                 "en_GU"\r
2428             }, {\r
2429                 "und_GW",\r
2430                 "pt_Latn_GW",\r
2431                 "pt_GW"\r
2432             }, {\r
2433                 "und_Geor",\r
2434                 "ka_Geor_GE",\r
2435                 "ka"\r
2436             }, {\r
2437                 "und_Grek",\r
2438                 "el_Grek_GR",\r
2439                 "el"\r
2440             }, {\r
2441                 "und_Gujr",\r
2442                 "gu_Gujr_IN",\r
2443                 "gu"\r
2444             }, {\r
2445                 "und_Guru",\r
2446                 "pa_Guru_IN",\r
2447                 "pa"\r
2448             }, {\r
2449                 "und_HK",\r
2450                 "zh_Hant_HK",\r
2451                 "zh_HK"\r
2452             }, {\r
2453                 "und_HN",\r
2454                 "es_Latn_HN",\r
2455                 "es_HN"\r
2456             }, {\r
2457                 "und_HR",\r
2458                 "hr_Latn_HR",\r
2459                 "hr"\r
2460             }, {\r
2461                 "und_HT",\r
2462                 "ht_Latn_HT",\r
2463                 "ht"\r
2464             }, {\r
2465                 "und_HU",\r
2466                 "hu_Latn_HU",\r
2467                 "hu"\r
2468             }, {\r
2469                 "und_Hani",\r
2470                 "zh_Hans_CN",\r
2471                 "zh"\r
2472             }, {\r
2473                 "und_Hans",\r
2474                 "zh_Hans_CN",\r
2475                 "zh"\r
2476             }, {\r
2477                 "und_Hant",\r
2478                 "zh_Hant_TW",\r
2479                 "zh_TW"\r
2480             }, {\r
2481                 "und_Hebr",\r
2482                 "he_Hebr_IL",\r
2483                 "he"\r
2484             }, {\r
2485                 "und_ID",\r
2486                 "id_Latn_ID",\r
2487                 "id"\r
2488             }, {\r
2489                 "und_IL",\r
2490                 "he_Hebr_IL",\r
2491                 "he"\r
2492             }, {\r
2493                 "und_IN",\r
2494                 "hi_Deva_IN",\r
2495                 "hi"\r
2496             }, {\r
2497                 "und_IQ",\r
2498                 "ar_Arab_IQ",\r
2499                 "ar_IQ"\r
2500             }, {\r
2501                 "und_IR",\r
2502                 "fa_Arab_IR",\r
2503                 "fa"\r
2504             }, {\r
2505                 "und_IS",\r
2506                 "is_Latn_IS",\r
2507                 "is"\r
2508             }, {\r
2509                 "und_IT",\r
2510                 "it_Latn_IT",\r
2511                 "it"\r
2512             }, {\r
2513                 "und_JO",\r
2514                 "ar_Arab_JO",\r
2515                 "ar_JO"\r
2516             }, {\r
2517                 "und_JP",\r
2518                 "ja_Jpan_JP",\r
2519                 "ja"\r
2520             }, {\r
2521                 "und_Jpan",\r
2522                 "ja_Jpan_JP",\r
2523                 "ja"\r
2524             }, {\r
2525                 "und_KG",\r
2526                 "ky_Cyrl_KG",\r
2527                 "ky"\r
2528             }, {\r
2529                 "und_KH",\r
2530                 "km_Khmr_KH",\r
2531                 "km"\r
2532             }, {\r
2533                 "und_KM",\r
2534                 "ar_Arab_KM",\r
2535                 "ar_KM"\r
2536             }, {\r
2537                 "und_KP",\r
2538                 "ko_Kore_KP",\r
2539                 "ko_KP"\r
2540             }, {\r
2541                 "und_KR",\r
2542                 "ko_Kore_KR",\r
2543                 "ko"\r
2544             }, {\r
2545                 "und_KW",\r
2546                 "ar_Arab_KW",\r
2547                 "ar_KW"\r
2548             }, {\r
2549                 "und_KZ",\r
2550                 "ru_Cyrl_KZ",\r
2551                 "ru_KZ"\r
2552             }, {\r
2553                 "und_Khmr",\r
2554                 "km_Khmr_KH",\r
2555                 "km"\r
2556             }, {\r
2557                 "und_Knda",\r
2558                 "kn_Knda_IN",\r
2559                 "kn"\r
2560             }, {\r
2561                 "und_Kore",\r
2562                 "ko_Kore_KR",\r
2563                 "ko"\r
2564             }, {\r
2565                 "und_LA",\r
2566                 "lo_Laoo_LA",\r
2567                 "lo"\r
2568             }, {\r
2569                 "und_LB",\r
2570                 "ar_Arab_LB",\r
2571                 "ar_LB"\r
2572             }, {\r
2573                 "und_LI",\r
2574                 "de_Latn_LI",\r
2575                 "de_LI"\r
2576             }, {\r
2577                 "und_LK",\r
2578                 "si_Sinh_LK",\r
2579                 "si"\r
2580             }, {\r
2581                 "und_LS",\r
2582                 "st_Latn_LS",\r
2583                 "st_LS"\r
2584             }, {\r
2585                 "und_LT",\r
2586                 "lt_Latn_LT",\r
2587                 "lt"\r
2588             }, {\r
2589                 "und_LU",\r
2590                 "fr_Latn_LU",\r
2591                 "fr_LU"\r
2592             }, {\r
2593                 "und_LV",\r
2594                 "lv_Latn_LV",\r
2595                 "lv"\r
2596             }, {\r
2597                 "und_LY",\r
2598                 "ar_Arab_LY",\r
2599                 "ar_LY"\r
2600             }, {\r
2601                 "und_Laoo",\r
2602                 "lo_Laoo_LA",\r
2603                 "lo"\r
2604             }, {\r
2605                 "und_Latn_ES",\r
2606                 "es_Latn_ES",\r
2607                 "es"\r
2608             }, {\r
2609                 "und_Latn_ET",\r
2610                 "en_Latn_ET",\r
2611                 "en_ET"\r
2612             }, {\r
2613                 "und_Latn_GB",\r
2614                 "en_Latn_GB",\r
2615                 "en_GB"\r
2616             }, {\r
2617                 "und_Latn_GH",\r
2618                 "ak_Latn_GH",\r
2619                 "ak"\r
2620             }, {\r
2621                 "und_Latn_ID",\r
2622                 "id_Latn_ID",\r
2623                 "id"\r
2624             }, {\r
2625                 "und_Latn_IT",\r
2626                 "it_Latn_IT",\r
2627                 "it"\r
2628             }, {\r
2629                 "und_Latn_NG",\r
2630                 "en_Latn_NG",\r
2631                 "en_NG"\r
2632             }, {\r
2633                 "und_Latn_TR",\r
2634                 "tr_Latn_TR",\r
2635                 "tr"\r
2636             }, {\r
2637                 "und_Latn_ZA",\r
2638                 "en_Latn_ZA",\r
2639                 "en_ZA"\r
2640             }, {\r
2641                 "und_MA",\r
2642                 "ar_Arab_MA",\r
2643                 "ar_MA"\r
2644             }, {\r
2645                 "und_MC",\r
2646                 "fr_Latn_MC",\r
2647                 "fr_MC"\r
2648             }, {\r
2649                 "und_MD",\r
2650                 "ro_Latn_MD",\r
2651                 "ro_MD"\r
2652             }, {\r
2653                 "und_ME",\r
2654                 "sr_Latn_ME",\r
2655                 "sr_ME"\r
2656             }, {\r
2657                 "und_MG",\r
2658                 "mg_Latn_MG",\r
2659                 "mg"\r
2660             }, {\r
2661                 "und_MK",\r
2662                 "mk_Cyrl_MK",\r
2663                 "mk"\r
2664             }, {\r
2665                 "und_ML",\r
2666                 "bm_Latn_ML",\r
2667                 "bm"\r
2668             }, {\r
2669                 "und_MM",\r
2670                 "my_Mymr_MM",\r
2671                 "my"\r
2672             }, {\r
2673                 "und_MN",\r
2674                 "mn_Cyrl_MN",\r
2675                 "mn"\r
2676             }, {\r
2677                 "und_MO",\r
2678                 "zh_Hant_MO",\r
2679                 "zh_MO"\r
2680             }, {\r
2681                 "und_MQ",\r
2682                 "fr_Latn_MQ",\r
2683                 "fr_MQ"\r
2684             }, {\r
2685                 "und_MR",\r
2686                 "ar_Arab_MR",\r
2687                 "ar_MR"\r
2688             }, {\r
2689                 "und_MT",\r
2690                 "mt_Latn_MT",\r
2691                 "mt"\r
2692             }, {\r
2693                 "und_MV",\r
2694                 "dv_Thaa_MV",\r
2695                 "dv"\r
2696             }, {\r
2697                 "und_MX",\r
2698                 "es_Latn_MX",\r
2699                 "es_MX"\r
2700             }, {\r
2701                 "und_MY",\r
2702                 "ms_Latn_MY",\r
2703                 "ms"\r
2704             }, {\r
2705                 "und_MZ",\r
2706                 "pt_Latn_MZ",\r
2707                 "pt_MZ"\r
2708             }, {\r
2709                 "und_Mlym",\r
2710                 "ml_Mlym_IN",\r
2711                 "ml"\r
2712             }, {\r
2713                 "und_Mymr",\r
2714                 "my_Mymr_MM",\r
2715                 "my"\r
2716             }, {\r
2717                 "und_NC",\r
2718                 "fr_Latn_NC",\r
2719                 "fr_NC"\r
2720             }, {\r
2721                 "und_NE",\r
2722                 "ha_Latn_NE",\r
2723                 "ha_NE"\r
2724             }, {\r
2725                 "und_NG",\r
2726                 "en_Latn_NG",\r
2727                 "en_NG"\r
2728             }, {\r
2729                 "und_NI",\r
2730                 "es_Latn_NI",\r
2731                 "es_NI"\r
2732             }, {\r
2733                 "und_NL",\r
2734                 "nl_Latn_NL",\r
2735                 "nl"\r
2736             }, {\r
2737                 "und_NO",\r
2738                 "nb_Latn_NO",\r
2739                 "nb"\r
2740             }, {\r
2741                 "und_NP",\r
2742                 "ne_Deva_NP",\r
2743                 "ne"\r
2744             }, {\r
2745                 "und_NR",\r
2746                 "en_Latn_NR",\r
2747                 "en_NR"\r
2748             }, {\r
2749                 "und_OM",\r
2750                 "ar_Arab_OM",\r
2751                 "ar_OM"\r
2752             }, {\r
2753                 "und_Orya",\r
2754                 "or_Orya_IN",\r
2755                 "or"\r
2756             }, {\r
2757                 "und_PA",\r
2758                 "es_Latn_PA",\r
2759                 "es_PA"\r
2760             }, {\r
2761                 "und_PE",\r
2762                 "es_Latn_PE",\r
2763                 "es_PE"\r
2764             }, {\r
2765                 "und_PF",\r
2766                 "fr_Latn_PF",\r
2767                 "fr_PF"\r
2768             }, {\r
2769                 "und_PG",\r
2770                 "tpi_Latn_PG",\r
2771                 "tpi"\r
2772             }, {\r
2773                 "und_PH",\r
2774                 "fil_Latn_PH",\r
2775                 "fil"\r
2776             }, {\r
2777                 "und_PL",\r
2778                 "pl_Latn_PL",\r
2779                 "pl"\r
2780             }, {\r
2781                 "und_PM",\r
2782                 "fr_Latn_PM",\r
2783                 "fr_PM"\r
2784             }, {\r
2785                 "und_PR",\r
2786                 "es_Latn_PR",\r
2787                 "es_PR"\r
2788             }, {\r
2789                 "und_PS",\r
2790                 "ar_Arab_PS",\r
2791                 "ar_PS"\r
2792             }, {\r
2793                 "und_PT",\r
2794                 "pt_Latn_PT",\r
2795                 "pt_PT"\r
2796             }, {\r
2797                 "und_PW",\r
2798                 "pau_Latn_PW",\r
2799                 "pau"\r
2800             }, {\r
2801                 "und_PY",\r
2802                 "gn_Latn_PY",\r
2803                 "gn"\r
2804             }, {\r
2805                 "und_QA",\r
2806                 "ar_Arab_QA",\r
2807                 "ar_QA"\r
2808             }, {\r
2809                 "und_RE",\r
2810                 "fr_Latn_RE",\r
2811                 "fr_RE"\r
2812             }, {\r
2813                 "und_RO",\r
2814                 "ro_Latn_RO",\r
2815                 "ro"\r
2816             }, {\r
2817                 "und_RS",\r
2818                 "sr_Cyrl_RS",\r
2819                 "sr"\r
2820             }, {\r
2821                 "und_RU",\r
2822                 "ru_Cyrl_RU",\r
2823                 "ru"\r
2824             }, {\r
2825                 "und_RW",\r
2826                 "rw_Latn_RW",\r
2827                 "rw"\r
2828             }, {\r
2829                 "und_SA",\r
2830                 "ar_Arab_SA",\r
2831                 "ar_SA"\r
2832             }, {\r
2833                 "und_SD",\r
2834                 "ar_Arab_SD",\r
2835                 "ar_SD"\r
2836             }, {\r
2837                 "und_SE",\r
2838                 "sv_Latn_SE",\r
2839                 "sv"\r
2840             }, {\r
2841                 "und_SG",\r
2842                 "en_Latn_SG",\r
2843                 "en_SG"\r
2844             }, {\r
2845                 "und_SI",\r
2846                 "sl_Latn_SI",\r
2847                 "sl"\r
2848             }, {\r
2849                 "und_SJ",\r
2850                 "nb_Latn_SJ",\r
2851                 "nb_SJ"\r
2852             }, {\r
2853                 "und_SK",\r
2854                 "sk_Latn_SK",\r
2855                 "sk"\r
2856             }, {\r
2857                 "und_SM",\r
2858                 "it_Latn_SM",\r
2859                 "it_SM"\r
2860             }, {\r
2861                 "und_SN",\r
2862                 "fr_Latn_SN",\r
2863                 "fr_SN"\r
2864             }, {\r
2865                 "und_SO",\r
2866                 "so_Latn_SO",\r
2867                 "so"\r
2868             }, {\r
2869                 "und_SR",\r
2870                 "nl_Latn_SR",\r
2871                 "nl_SR"\r
2872             }, {\r
2873                 "und_ST",\r
2874                 "pt_Latn_ST",\r
2875                 "pt_ST"\r
2876             }, {\r
2877                 "und_SV",\r
2878                 "es_Latn_SV",\r
2879                 "es_SV"\r
2880             }, {\r
2881                 "und_SY",\r
2882                 "ar_Arab_SY",\r
2883                 "ar_SY"\r
2884             }, {\r
2885                 "und_Sinh",\r
2886                 "si_Sinh_LK",\r
2887                 "si"\r
2888             }, {\r
2889                 "und_Syrc",\r
2890                 "en_Syrc_US",\r
2891                 "en_Syrc"\r
2892             }, {\r
2893                 "und_TD",\r
2894                 "fr_Latn_TD",\r
2895                 "fr_TD"\r
2896             }, {\r
2897                 "und_TG",\r
2898                 "fr_Latn_TG",\r
2899                 "fr_TG"\r
2900             }, {\r
2901                 "und_TH",\r
2902                 "th_Thai_TH",\r
2903                 "th"\r
2904             }, {\r
2905                 "und_TJ",\r
2906                 "tg_Cyrl_TJ",\r
2907                 "tg"\r
2908             }, {\r
2909                 "und_TK",\r
2910                 "tkl_Latn_TK",\r
2911                 "tkl"\r
2912             }, {\r
2913                 "und_TL",\r
2914                 "pt_Latn_TL",\r
2915                 "pt_TL"\r
2916             }, {\r
2917                 "und_TM",\r
2918                 "tk_Latn_TM",\r
2919                 "tk"\r
2920             }, {\r
2921                 "und_TN",\r
2922                 "ar_Arab_TN",\r
2923                 "ar_TN"\r
2924             }, {\r
2925                 "und_TO",\r
2926                 "to_Latn_TO",\r
2927                 "to"\r
2928             }, {\r
2929                 "und_TR",\r
2930                 "tr_Latn_TR",\r
2931                 "tr"\r
2932             }, {\r
2933                 "und_TV",\r
2934                 "tvl_Latn_TV",\r
2935                 "tvl"\r
2936             }, {\r
2937                 "und_TW",\r
2938                 "zh_Hant_TW",\r
2939                 "zh_TW"\r
2940             }, {\r
2941                 "und_Taml",\r
2942                 "ta_Taml_IN",\r
2943                 "ta"\r
2944             }, {\r
2945                 "und_Telu",\r
2946                 "te_Telu_IN",\r
2947                 "te"\r
2948             }, {\r
2949                 "und_Thaa",\r
2950                 "dv_Thaa_MV",\r
2951                 "dv"\r
2952             }, {\r
2953                 "und_Thai",\r
2954                 "th_Thai_TH",\r
2955                 "th"\r
2956             }, {\r
2957                 "und_Tibt",\r
2958                 "bo_Tibt_CN",\r
2959                 "bo"\r
2960             }, {\r
2961                 "und_UA",\r
2962                 "uk_Cyrl_UA",\r
2963                 "uk"\r
2964             }, {\r
2965                 "und_UY",\r
2966                 "es_Latn_UY",\r
2967                 "es_UY"\r
2968             }, {\r
2969                 "und_UZ",\r
2970                 "uz_Cyrl_UZ",\r
2971                 "uz"\r
2972             }, {\r
2973                 "und_VA",\r
2974                 "la_Latn_VA",\r
2975                 "la"\r
2976             }, {\r
2977                 "und_VE",\r
2978                 "es_Latn_VE",\r
2979                 "es_VE"\r
2980             }, {\r
2981                 "und_VN",\r
2982                 "vi_Latn_VN",\r
2983                 "vi"\r
2984             }, {\r
2985                 "und_VU",\r
2986                 "fr_Latn_VU",\r
2987                 "fr_VU"\r
2988             }, {\r
2989                 "und_WF",\r
2990                 "fr_Latn_WF",\r
2991                 "fr_WF"\r
2992             }, {\r
2993                 "und_WS",\r
2994                 "sm_Latn_WS",\r
2995                 "sm"\r
2996             }, {\r
2997                 "und_YE",\r
2998                 "ar_Arab_YE",\r
2999                 "ar_YE"\r
3000             }, {\r
3001                 "und_YT",\r
3002                 "fr_Latn_YT",\r
3003                 "fr_YT"\r
3004             }, {\r
3005                 "und_Yiii",\r
3006                 "ii_Yiii_CN",\r
3007                 "ii"\r
3008             }, {\r
3009                 "ur",\r
3010                 "ur_Arab_PK",\r
3011                 "ur"\r
3012             }, {\r
3013                 "uz",\r
3014                 "uz_Cyrl_UZ",\r
3015                 "uz"\r
3016             }, {\r
3017                 "uz_AF",\r
3018                 "uz_Arab_AF",\r
3019                 "uz_AF"\r
3020             }, {\r
3021                 "uz_Arab",\r
3022                 "uz_Arab_AF",\r
3023                 "uz_AF"\r
3024             }, {\r
3025                 "ve",\r
3026                 "ve_Latn_ZA",\r
3027                 "ve"\r
3028             }, {\r
3029                 "vi",\r
3030                 "vi_Latn_VN",\r
3031                 "vi"\r
3032             }, {\r
3033                 "wal",\r
3034                 "wal_Ethi_ET",\r
3035                 "wal"\r
3036             }, {\r
3037                 "wo",\r
3038                 "wo_Latn_SN",\r
3039                 "wo"\r
3040             }, {\r
3041                 "wo_SN",\r
3042                 "wo_Latn_SN",\r
3043                 "wo"\r
3044             }, {\r
3045                 "xh",\r
3046                 "xh_Latn_ZA",\r
3047                 "xh"\r
3048             }, {\r
3049                 "yo",\r
3050                 "yo_Latn_NG",\r
3051                 "yo"\r
3052             }, {\r
3053                 "zh",\r
3054                 "zh_Hans_CN",\r
3055                 "zh"\r
3056             }, {\r
3057                 "zh_HK",\r
3058                 "zh_Hant_HK",\r
3059                 "zh_HK"\r
3060             }, {\r
3061                 "zh_Hani",\r
3062                 "zh_Hans_CN",\r
3063                 "zh"\r
3064             }, {\r
3065                 "zh_Hant",\r
3066                 "zh_Hant_TW",\r
3067                 "zh_TW"\r
3068             }, {\r
3069                 "zh_MO",\r
3070                 "zh_Hant_MO",\r
3071                 "zh_MO"\r
3072             }, {\r
3073                 "zh_TW",\r
3074                 "zh_Hant_TW",\r
3075                 "zh_TW"\r
3076             }, {\r
3077                 "zu",\r
3078                 "zu_Latn_ZA",\r
3079                 "zu"\r
3080             }, {\r
3081                 "und",\r
3082                 "en_Latn_US",\r
3083                 "en"\r
3084             }, {\r
3085                 "und_ZZ",\r
3086                 "en_Latn_US",\r
3087                 "en"\r
3088             }, {\r
3089                 "und_CN",\r
3090                 "zh_Hans_CN",\r
3091                 "zh"\r
3092             }, {\r
3093                 "und_TW",\r
3094                 "zh_Hant_TW",\r
3095                 "zh_TW"\r
3096             }, {\r
3097                 "und_HK",\r
3098                 "zh_Hant_HK",\r
3099                 "zh_HK"\r
3100             }, {\r
3101                 "und_AQ",\r
3102                 "en_Latn_AQ",\r
3103                 "en_AQ"\r
3104             }, {\r
3105                 "und_Zzzz",\r
3106                 "en_Latn_US",\r
3107                 "en"\r
3108             }, {\r
3109                 "und_Zzzz_ZZ",\r
3110                 "en_Latn_US",\r
3111                 "en"\r
3112             }, {\r
3113                 "und_Zzzz_CN",\r
3114                 "zh_Hans_CN",\r
3115                 "zh"\r
3116             }, {\r
3117                 "und_Zzzz_TW",\r
3118                 "zh_Hant_TW",\r
3119                 "zh_TW"\r
3120             }, {\r
3121                 "und_Zzzz_HK",\r
3122                 "zh_Hant_HK",\r
3123                 "zh_HK"\r
3124             }, {\r
3125                 "und_Zzzz_AQ",\r
3126                 "en_Latn_AQ",\r
3127                 "en_AQ"\r
3128             }, {\r
3129                 "und_Latn",\r
3130                 "en_Latn_US",\r
3131                 "en"\r
3132             }, {\r
3133                 "und_Latn_ZZ",\r
3134                 "en_Latn_US",\r
3135                 "en"\r
3136             }, {\r
3137                 "und_Latn_CN",\r
3138                 "za_Latn_CN",\r
3139                 "za"\r
3140             }, {\r
3141                 "und_Latn_TW",\r
3142                 "zh_Latn_TW",\r
3143                 "zh_Latn_TW"\r
3144             }, {\r
3145                 "und_Latn_HK",\r
3146                 "zh_Latn_HK",\r
3147                 "zh_Latn_HK"\r
3148             }, {\r
3149                 "und_Latn_AQ",\r
3150                 "en_Latn_AQ",\r
3151                 "en_AQ"\r
3152             }, {\r
3153                 "und_Hans",\r
3154                 "zh_Hans_CN",\r
3155                 "zh"\r
3156             }, {\r
3157                 "und_Hans_ZZ",\r
3158                 "zh_Hans_CN",\r
3159                 "zh"\r
3160             }, {\r
3161                 "und_Hans_CN",\r
3162                 "zh_Hans_CN",\r
3163                 "zh"\r
3164             }, {\r
3165                 "und_Hans_TW",\r
3166                 "zh_Hans_TW",\r
3167                 "zh_Hans_TW"\r
3168             }, {\r
3169                 "und_Hans_HK",\r
3170                 "zh_Hans_HK",\r
3171                 "zh_Hans_HK"\r
3172             }, {\r
3173                 "und_Hans_AQ",\r
3174                 "zh_Hans_AQ",\r
3175                 "zh_AQ"\r
3176             }, {\r
3177                 "und_Hant",\r
3178                 "zh_Hant_TW",\r
3179                 "zh_TW"\r
3180             }, {\r
3181                 "und_Hant_ZZ",\r
3182                 "zh_Hant_TW",\r
3183                 "zh_TW"\r
3184             }, {\r
3185                 "und_Hant_CN",\r
3186                 "zh_Hant_CN",\r
3187                 "zh_Hant_CN"\r
3188             }, {\r
3189                 "und_Hant_TW",\r
3190                 "zh_Hant_TW",\r
3191                 "zh_TW"\r
3192             }, {\r
3193                 "und_Hant_HK",\r
3194                 "zh_Hant_HK",\r
3195                 "zh_HK"\r
3196             }, {\r
3197                 "und_Hant_AQ",\r
3198                 "zh_Hant_AQ",\r
3199                 "zh_Hant_AQ"\r
3200             }, {\r
3201                 "und_Moon",\r
3202                 "en_Moon_US",\r
3203                 "en_Moon"\r
3204             }, {\r
3205                 "und_Moon_ZZ",\r
3206                 "en_Moon_US",\r
3207                 "en_Moon"\r
3208             }, {\r
3209                 "und_Moon_CN",\r
3210                 "zh_Moon_CN",\r
3211                 "zh_Moon"\r
3212             }, {\r
3213                 "und_Moon_TW",\r
3214                 "zh_Moon_TW",\r
3215                 "zh_Moon_TW"\r
3216             }, {\r
3217                 "und_Moon_HK",\r
3218                 "zh_Moon_HK",\r
3219                 "zh_Moon_HK"\r
3220             }, {\r
3221                 "und_Moon_AQ",\r
3222                 "en_Moon_AQ",\r
3223                 "en_Moon_AQ"\r
3224             }, {\r
3225                 "es",\r
3226                 "es_Latn_ES",\r
3227                 "es"\r
3228             }, {\r
3229                 "es_ZZ",\r
3230                 "es_Latn_ES",\r
3231                 "es"\r
3232             }, {\r
3233                 "es_CN",\r
3234                 "es_Latn_CN",\r
3235                 "es_CN"\r
3236             }, {\r
3237                 "es_TW",\r
3238                 "es_Latn_TW",\r
3239                 "es_TW"\r
3240             }, {\r
3241                 "es_HK",\r
3242                 "es_Latn_HK",\r
3243                 "es_HK"\r
3244             }, {\r
3245                 "es_AQ",\r
3246                 "es_Latn_AQ",\r
3247                 "es_AQ"\r
3248             }, {\r
3249                 "es_Zzzz",\r
3250                 "es_Latn_ES",\r
3251                 "es"\r
3252             }, {\r
3253                 "es_Zzzz_ZZ",\r
3254                 "es_Latn_ES",\r
3255                 "es"\r
3256             }, {\r
3257                 "es_Zzzz_CN",\r
3258                 "es_Latn_CN",\r
3259                 "es_CN"\r
3260             }, {\r
3261                 "es_Zzzz_TW",\r
3262                 "es_Latn_TW",\r
3263                 "es_TW"\r
3264             }, {\r
3265                 "es_Zzzz_HK",\r
3266                 "es_Latn_HK",\r
3267                 "es_HK"\r
3268             }, {\r
3269                 "es_Zzzz_AQ",\r
3270                 "es_Latn_AQ",\r
3271                 "es_AQ"\r
3272             }, {\r
3273                 "es_Latn",\r
3274                 "es_Latn_ES",\r
3275                 "es"\r
3276             }, {\r
3277                 "es_Latn_ZZ",\r
3278                 "es_Latn_ES",\r
3279                 "es"\r
3280             }, {\r
3281                 "es_Latn_CN",\r
3282                 "es_Latn_CN",\r
3283                 "es_CN"\r
3284             }, {\r
3285                 "es_Latn_TW",\r
3286                 "es_Latn_TW",\r
3287                 "es_TW"\r
3288             }, {\r
3289                 "es_Latn_HK",\r
3290                 "es_Latn_HK",\r
3291                 "es_HK"\r
3292             }, {\r
3293                 "es_Latn_AQ",\r
3294                 "es_Latn_AQ",\r
3295                 "es_AQ"\r
3296             }, {\r
3297                 "es_Hans",\r
3298                 "es_Hans_ES",\r
3299                 "es_Hans"\r
3300             }, {\r
3301                 "es_Hans_ZZ",\r
3302                 "es_Hans_ES",\r
3303                 "es_Hans"\r
3304             }, {\r
3305                 "es_Hans_CN",\r
3306                 "es_Hans_CN",\r
3307                 "es_Hans_CN"\r
3308             }, {\r
3309                 "es_Hans_TW",\r
3310                 "es_Hans_TW",\r
3311                 "es_Hans_TW"\r
3312             }, {\r
3313                 "es_Hans_HK",\r
3314                 "es_Hans_HK",\r
3315                 "es_Hans_HK"\r
3316             }, {\r
3317                 "es_Hans_AQ",\r
3318                 "es_Hans_AQ",\r
3319                 "es_Hans_AQ"\r
3320             }, {\r
3321                 "es_Hant",\r
3322                 "es_Hant_ES",\r
3323                 "es_Hant"\r
3324             }, {\r
3325                 "es_Hant_ZZ",\r
3326                 "es_Hant_ES",\r
3327                 "es_Hant"\r
3328             }, {\r
3329                 "es_Hant_CN",\r
3330                 "es_Hant_CN",\r
3331                 "es_Hant_CN"\r
3332             }, {\r
3333                 "es_Hant_TW",\r
3334                 "es_Hant_TW",\r
3335                 "es_Hant_TW"\r
3336             }, {\r
3337                 "es_Hant_HK",\r
3338                 "es_Hant_HK",\r
3339                 "es_Hant_HK"\r
3340             }, {\r
3341                 "es_Hant_AQ",\r
3342                 "es_Hant_AQ",\r
3343                 "es_Hant_AQ"\r
3344             }, {\r
3345                 "es_Moon",\r
3346                 "es_Moon_ES",\r
3347                 "es_Moon"\r
3348             }, {\r
3349                 "es_Moon_ZZ",\r
3350                 "es_Moon_ES",\r
3351                 "es_Moon"\r
3352             }, {\r
3353                 "es_Moon_CN",\r
3354                 "es_Moon_CN",\r
3355                 "es_Moon_CN"\r
3356             }, {\r
3357                 "es_Moon_TW",\r
3358                 "es_Moon_TW",\r
3359                 "es_Moon_TW"\r
3360             }, {\r
3361                 "es_Moon_HK",\r
3362                 "es_Moon_HK",\r
3363                 "es_Moon_HK"\r
3364             }, {\r
3365                 "es_Moon_AQ",\r
3366                 "es_Moon_AQ",\r
3367                 "es_Moon_AQ"\r
3368             }, {\r
3369                 "zh",\r
3370                 "zh_Hans_CN",\r
3371                 "zh"\r
3372             }, {\r
3373                 "zh_ZZ",\r
3374                 "zh_Hans_CN",\r
3375                 "zh"\r
3376             }, {\r
3377                 "zh_CN",\r
3378                 "zh_Hans_CN",\r
3379                 "zh"\r
3380             }, {\r
3381                 "zh_TW",\r
3382                 "zh_Hant_TW",\r
3383                 "zh_TW"\r
3384             }, {\r
3385                 "zh_HK",\r
3386                 "zh_Hant_HK",\r
3387                 "zh_HK"\r
3388             }, {\r
3389                 "zh_AQ",\r
3390                 "zh_Hans_AQ",\r
3391                 "zh_AQ"\r
3392             }, {\r
3393                 "zh_Zzzz",\r
3394                 "zh_Hans_CN",\r
3395                 "zh"\r
3396             }, {\r
3397                 "zh_Zzzz_ZZ",\r
3398                 "zh_Hans_CN",\r
3399                 "zh"\r
3400             }, {\r
3401                 "zh_Zzzz_CN",\r
3402                 "zh_Hans_CN",\r
3403                 "zh"\r
3404             }, {\r
3405                 "zh_Zzzz_TW",\r
3406                 "zh_Hant_TW",\r
3407                 "zh_TW"\r
3408             }, {\r
3409                 "zh_Zzzz_HK",\r
3410                 "zh_Hant_HK",\r
3411                 "zh_HK"\r
3412             }, {\r
3413                 "zh_Zzzz_AQ",\r
3414                 "zh_Hans_AQ",\r
3415                 "zh_AQ"\r
3416             }, {\r
3417                 "zh_Latn",\r
3418                 "zh_Latn_CN",\r
3419                 "zh_Latn"\r
3420             }, {\r
3421                 "zh_Latn_ZZ",\r
3422                 "zh_Latn_CN",\r
3423                 "zh_Latn"\r
3424             }, {\r
3425                 "zh_Latn_CN",\r
3426                 "zh_Latn_CN",\r
3427                 "zh_Latn"\r
3428             }, {\r
3429                 "zh_Latn_TW",\r
3430                 "zh_Latn_TW",\r
3431                 "zh_Latn_TW"\r
3432             }, {\r
3433                 "zh_Latn_HK",\r
3434                 "zh_Latn_HK",\r
3435                 "zh_Latn_HK"\r
3436             }, {\r
3437                 "zh_Latn_AQ",\r
3438                 "zh_Latn_AQ",\r
3439                 "zh_Latn_AQ"\r
3440             }, {\r
3441                 "zh_Hans",\r
3442                 "zh_Hans_CN",\r
3443                 "zh"\r
3444             }, {\r
3445                 "zh_Hans_ZZ",\r
3446                 "zh_Hans_CN",\r
3447                 "zh"\r
3448             }, {\r
3449                 "zh_Hans_TW",\r
3450                 "zh_Hans_TW",\r
3451                 "zh_Hans_TW"\r
3452             }, {\r
3453                 "zh_Hans_HK",\r
3454                 "zh_Hans_HK",\r
3455                 "zh_Hans_HK"\r
3456             }, {\r
3457                 "zh_Hans_AQ",\r
3458                 "zh_Hans_AQ",\r
3459                 "zh_AQ"\r
3460             }, {\r
3461                 "zh_Hant",\r
3462                 "zh_Hant_TW",\r
3463                 "zh_TW"\r
3464             }, {\r
3465                 "zh_Hant_ZZ",\r
3466                 "zh_Hant_TW",\r
3467                 "zh_TW"\r
3468             }, {\r
3469                 "zh_Hant_CN",\r
3470                 "zh_Hant_CN",\r
3471                 "zh_Hant_CN"\r
3472             }, {\r
3473                 "zh_Hant_AQ",\r
3474                 "zh_Hant_AQ",\r
3475                 "zh_Hant_AQ"\r
3476             }, {\r
3477                 "zh_Moon",\r
3478                 "zh_Moon_CN",\r
3479                 "zh_Moon"\r
3480             }, {\r
3481                 "zh_Moon_ZZ",\r
3482                 "zh_Moon_CN",\r
3483                 "zh_Moon"\r
3484             }, {\r
3485                 "zh_Moon_CN",\r
3486                 "zh_Moon_CN",\r
3487                 "zh_Moon"\r
3488             }, {\r
3489                 "zh_Moon_TW",\r
3490                 "zh_Moon_TW",\r
3491                 "zh_Moon_TW"\r
3492             }, {\r
3493                 "zh_Moon_HK",\r
3494                 "zh_Moon_HK",\r
3495                 "zh_Moon_HK"\r
3496             }, {\r
3497                 "zh_Moon_AQ",\r
3498                 "zh_Moon_AQ",\r
3499                 "zh_Moon_AQ"\r
3500             }, {\r
3501                 "art",\r
3502                 "",\r
3503                 ""\r
3504             }, {\r
3505                 "art_ZZ",\r
3506                 "",\r
3507                 ""\r
3508             }, {\r
3509                 "art_CN",\r
3510                 "",\r
3511                 ""\r
3512             }, {\r
3513                 "art_TW",\r
3514                 "",\r
3515                 ""\r
3516             }, {\r
3517                 "art_HK",\r
3518                 "",\r
3519                 ""\r
3520             }, {\r
3521                 "art_AQ",\r
3522                 "",\r
3523                 ""\r
3524             }, {\r
3525                 "art_Zzzz",\r
3526                 "",\r
3527                 ""\r
3528             }, {\r
3529                 "art_Zzzz_ZZ",\r
3530                 "",\r
3531                 ""\r
3532             }, {\r
3533                 "art_Zzzz_CN",\r
3534                 "",\r
3535                 ""\r
3536             }, {\r
3537                 "art_Zzzz_TW",\r
3538                 "",\r
3539                 ""\r
3540             }, {\r
3541                 "art_Zzzz_HK",\r
3542                 "",\r
3543                 ""\r
3544             }, {\r
3545                 "art_Zzzz_AQ",\r
3546                 "",\r
3547                 ""\r
3548             }, {\r
3549                 "art_Latn",\r
3550                 "",\r
3551                 ""\r
3552             }, {\r
3553                 "art_Latn_ZZ",\r
3554                 "",\r
3555                 ""\r
3556             }, {\r
3557                 "art_Latn_CN",\r
3558                 "",\r
3559                 ""\r
3560             }, {\r
3561                 "art_Latn_TW",\r
3562                 "",\r
3563                 ""\r
3564             }, {\r
3565                 "art_Latn_HK",\r
3566                 "",\r
3567                 ""\r
3568             }, {\r
3569                 "art_Latn_AQ",\r
3570                 "",\r
3571                 ""\r
3572             }, {\r
3573                 "art_Hans",\r
3574                 "",\r
3575                 ""\r
3576             }, {\r
3577                 "art_Hans_ZZ",\r
3578                 "",\r
3579                 ""\r
3580             }, {\r
3581                 "art_Hans_CN",\r
3582                 "",\r
3583                 ""\r
3584             }, {\r
3585                 "art_Hans_TW",\r
3586                 "",\r
3587                 ""\r
3588             }, {\r
3589                 "art_Hans_HK",\r
3590                 "",\r
3591                 ""\r
3592             }, {\r
3593                 "art_Hans_AQ",\r
3594                 "",\r
3595                 ""\r
3596             }, {\r
3597                 "art_Hant",\r
3598                 "",\r
3599                 ""\r
3600             }, {\r
3601                 "art_Hant_ZZ",\r
3602                 "",\r
3603                 ""\r
3604             }, {\r
3605                 "art_Hant_CN",\r
3606                 "",\r
3607                 ""\r
3608             }, {\r
3609                 "art_Hant_TW",\r
3610                 "",\r
3611                 ""\r
3612             }, {\r
3613                 "art_Hant_HK",\r
3614                 "",\r
3615                 ""\r
3616             }, {\r
3617                 "art_Hant_AQ",\r
3618                 "",\r
3619                 ""\r
3620             }, {\r
3621                 "art_Moon",\r
3622                 "",\r
3623                 ""\r
3624             }, {\r
3625                 "art_Moon_ZZ",\r
3626                 "",\r
3627                 ""\r
3628             }, {\r
3629                 "art_Moon_CN",\r
3630                 "",\r
3631                 ""\r
3632             }, {\r
3633                 "art_Moon_TW",\r
3634                 "",\r
3635                 ""\r
3636             }, {\r
3637                 "art_Moon_HK",\r
3638                 "",\r
3639                 ""\r
3640             }, {\r
3641                 "art_Moon_AQ",\r
3642                 "",\r
3643                 ""\r
3644             }\r
3645         };\r
3646 \r
3647         for (int i = 0; i < full_data.length; i++) {\r
3648             ULocale org = new ULocale(full_data[i][0]);\r
3649             ULocale res = ULocale.addLikelySubtags(org);\r
3650             String exp = full_data[i][1];\r
3651             if (exp.length() == 0) {\r
3652                 if (!org.equals(res)) {\r
3653                     errln("Original: " + full_data[i][0] + " expected: " + exp + " - but got " + res.toString());\r
3654                 }\r
3655             }\r
3656             else if (!res.toString().equals(exp)) {\r
3657                 errln("Original: " + full_data[i][0] + " expected: " + exp + " - but got " + res.toString());\r
3658             }\r
3659         }\r
3660 \r
3661         for (int i = 0; i < full_data.length; i++) {\r
3662             String maximal = full_data[i][1];\r
3663 \r
3664             if (maximal.length() > 0) {\r
3665                 ULocale org = new ULocale(maximal);\r
3666                 ULocale res = ULocale.minimizeSubtags(org);\r
3667                 String exp = full_data[i][2];\r
3668                 if (exp.length() == 0) {\r
3669                     if (!org.equals(res)) {\r
3670                         errln("Original: " + full_data[i][1] + " expected: " + exp + " - but got " + res.toString());\r
3671                     }\r
3672                 }\r
3673                 else if (!res.toString().equals(exp)) {\r
3674                     errln("Original: " + full_data[i][1] + " expected: " + exp + " - but got " + res.toString());\r
3675                 }\r
3676             }\r
3677         }\r
3678     }\r
3679     public void TestCLDRVersion() {\r
3680         //VersionInfo zeroVersion = VersionInfo.getInstance(0, 0, 0, 0);\r
3681         VersionInfo testExpect;\r
3682         VersionInfo testCurrent;\r
3683         VersionInfo cldrVersion;\r
3684  \r
3685         cldrVersion = LocaleData.getCLDRVersion();\r
3686         \r
3687         this.logln("uloc_getCLDRVersion() returned: '"+cldrVersion+"'");\r
3688         \r
3689         // why isn't this public for tests somewhere?\r
3690         final ClassLoader testLoader = ICUResourceBundleTest.class.getClassLoader();\r
3691         UResourceBundle bundle = (UResourceBundle) UResourceBundle.getBundleInstance("com/ibm/icu/dev/data/testdata", ULocale.ROOT, testLoader);\r
3692         \r
3693         testExpect = VersionInfo.getInstance(bundle.getString("ExpectCLDRVersionAtLeast"));\r
3694         testCurrent = VersionInfo.getInstance(bundle.getString("CurrentCLDRVersion"));\r
3695 \r
3696         \r
3697         logln("(data) ExpectCLDRVersionAtLeast { "+testExpect+""); \r
3698         if(cldrVersion.compareTo(testExpect)<0) {\r
3699             errln("CLDR version is too old, expect at least "+testExpect+".");\r
3700         }\r
3701 \r
3702         int r = cldrVersion.compareTo(testCurrent);\r
3703         if ( r < 0 ) {\r
3704             logln("CLDR version is behind 'current' (for testdata/root.txt) "+testCurrent+". Some things may fail.\n");\r
3705         } else if ( r > 0) {\r
3706             logln("CLDR version is ahead of 'current' (for testdata/root.txt) "+testCurrent+". Some things may fail.\n");\r
3707         } else {\r
3708             // CLDR version is OK.\r
3709         }\r
3710     }\r
3711 \r
3712     public void TestToLanguageTag() {\r
3713         final String[][] locale_to_langtag = {\r
3714             {"",            "und"},\r
3715             {"en",          "en"},\r
3716             {"en_US",       "en-US"},\r
3717             {"iw_IL",       "he-IL"},\r
3718             {"sr_Latn_SR",  "sr-Latn-SR"},\r
3719             {"en__POSIX",   "en-posix"},\r
3720             // {"en_POSIX",    "en"}, /* ICU4J locale parser successfully parse en_POSIX as language:en/variant:POSIX */\r
3721             {"und_555",     "und-555"},\r
3722             {"123",         "und"},\r
3723             {"%$#&",        "und"},\r
3724             {"_Latn",       "und-Latn"},\r
3725             {"_DE",         "und-DE"},\r
3726             {"und_FR",      "und-FR"},\r
3727             {"th_TH_TH",    "th-TH-x-variant-th"},\r
3728             {"bogus",       "bogus"},\r
3729             {"foooobarrr",  "und"},\r
3730             //{"az_AZ_CYRL",  "az-cyrl-az"}, /* ICU4J does not have this specia locale mapping */\r
3731             {"aa_BB_CYRL",  "aa-BB-x-variant-cyrl"},\r
3732             {"en_US_1234",  "en-US-1234"},\r
3733             {"en_US_VARIANTA_VARIANTB", "en-US-varianta-variantb"},\r
3734             {"en_US_VARIANTB_VARIANTA", "en-US-variantb-varianta"},\r
3735             {"ja__9876_5432",   "ja-9876-5432"},\r
3736             {"zh_Hant__VAR",    "zh-Hant-x-variant-var"},\r
3737             {"es__BADVARIANT_GOODVAR",  "es"},\r
3738             {"es__GOODVAR_BAD_BADVARIANT",  "es-goodvar-x-variant-bad"},\r
3739             {"en@calendar=gregorian",   "en-u-ca-gregory"},\r
3740             {"de@collation=phonebook;calendar=gregorian",   "de-u-ca-gregory-co-phonebk"},\r
3741             {"th@numbers=thai;z=extz;x=priv-use;a=exta",   "th-a-exta-u-nu-thai-z-extz-x-priv-use"},\r
3742             {"en@timezone=America/New_York;calendar=japanese",    "en-u-ca-japanese-tz-usnyc"},\r
3743             {"en@timezone=US/Eastern",    "en-u-tz-usnyc"},\r
3744             {"en@x=x-y-z;a=a-b-c",  "en-x-x-y-z"},\r
3745             {"it@collation=badcollationtype;colStrength=identical;cu=usd-eur", "it-u-ks-identic"},\r
3746         };\r
3747 \r
3748         for (int i = 0; i < locale_to_langtag.length; i++) {\r
3749             ULocale loc = new ULocale(locale_to_langtag[i][0]);\r
3750             String langtag = loc.toLanguageTag();\r
3751             if (!langtag.equals(locale_to_langtag[i][1])) {\r
3752                 errln("FAIL: toLanguageTag returned language tag [" + langtag + "] for locale ["\r
3753                         + loc + "] - expected: [" + locale_to_langtag[i][1] + "]");\r
3754             }\r
3755         }\r
3756     }\r
3757 \r
3758     public void TestForLanguageTag() {\r
3759         final Integer NOERROR = Integer.valueOf(-1);\r
3760 \r
3761         final Object[][] langtag_to_locale = {\r
3762             {"en",                  "en",                   NOERROR},\r
3763             {"en-us",               "en_US",                NOERROR},\r
3764             {"und-us",              "_US",                  NOERROR},\r
3765             {"und-latn",            "_Latn",                NOERROR},\r
3766             {"en-us-posix",         "en_US_POSIX",          NOERROR},\r
3767             {"de-de_euro",          "de",                   Integer.valueOf(3)},\r
3768             {"kok-in",              "kok_IN",               NOERROR},\r
3769             {"123",                 "",                     Integer.valueOf(0)},\r
3770             {"en_us",               "",                     Integer.valueOf(0)},\r
3771             {"en-latn-x",           "en_Latn",              Integer.valueOf(8)},\r
3772             {"art-lojban",          "jbo",                  NOERROR},\r
3773             {"zh-hakka",            "hak",                  NOERROR},\r
3774             {"zh-cmn-CH",           "cmn_CH",               NOERROR},\r
3775             {"xxx-yy",              "xxx_YY",               NOERROR},\r
3776             {"fr-234",              "fr_234",               NOERROR},\r
3777             {"i-default",           "",                     NOERROR},\r
3778             {"i-test",              "",                     Integer.valueOf(0)},\r
3779             {"ja-jp-jp",            "ja_JP",                Integer.valueOf(6)},\r
3780             {"bogus",               "bogus",                NOERROR},\r
3781             {"boguslang",           "",                     Integer.valueOf(0)},\r
3782             {"EN-lATN-us",          "en_Latn_US",           NOERROR},\r
3783             {"und-variant-1234",    "__VARIANT_1234",       NOERROR},\r
3784             {"und-varzero-var1-vartwo", "__VARZERO",        Integer.valueOf(12)},\r
3785             {"en-u-ca-gregory",     "en@calendar=gregorian",    NOERROR},\r
3786             {"en-U-cu-USD",         "en@currency=usd",      NOERROR},\r
3787             {"ar-x-1-2-3",          "ar@x=1-2-3",           NOERROR},\r
3788             {"fr-u-nu-latn-cu-eur", "fr@currency=eur;numbers=latn", NOERROR},\r
3789             {"de-k-kext-u-co-phonebk-nu-latn",  "de@collation=phonebook;k=kext;numbers=latn",   NOERROR},\r
3790             {"ja-u-cu-jpy-ca-jp",   "ja@currency=jpy",      Integer.valueOf(15)},\r
3791             {"en-us-u-tz-usnyc",    "en_US@timezone=America/New_York",      NOERROR},\r
3792             {"und-a-abc-def",       "@a=abc-def",           NOERROR},\r
3793             {"zh-u-ca-chinese-x-u-ca-chinese",  "zh@calendar=chinese;x=u-ca-chinese",   NOERROR},\r
3794             {"fr--FR",              "fr",                   Integer.valueOf(3)},\r
3795             {"fr-",                 "fr",                   Integer.valueOf(3)},\r
3796         };\r
3797 \r
3798         for (int i = 0; i < langtag_to_locale.length; i++) {\r
3799             String tag = (String)langtag_to_locale[i][0];\r
3800             ULocale expected = new ULocale((String)langtag_to_locale[i][1]);\r
3801             ULocale loc = ULocale.forLanguageTag(tag);\r
3802 \r
3803             if (!loc.equals(expected)) {\r
3804                 errln("FAIL: forLanguageTag returned locale [" + loc + "] for language tag [" + tag\r
3805                         + "] - expected: [" + expected + "]");\r
3806             }\r
3807         }\r
3808 \r
3809         // Use locale builder to check errors\r
3810         for (int i = 0; i < langtag_to_locale.length; i++) {\r
3811             String tag = (String)langtag_to_locale[i][0];\r
3812             ULocale expected = new ULocale((String)langtag_to_locale[i][1]);\r
3813             int errorIdx = ((Integer)langtag_to_locale[i][2]).intValue();\r
3814 \r
3815             try {\r
3816                 Builder bld = new Builder();\r
3817                 bld.setLanguageTag(tag);\r
3818                 ULocale loc = bld.build();\r
3819 \r
3820                 if (!loc.equals(expected)) {\r
3821                     errln("FAIL: forLanguageTag returned locale [" + loc + "] for language tag [" + tag\r
3822                             + "] - expected: [" + expected + "]");\r
3823                 }\r
3824                 if (errorIdx != NOERROR.intValue()) {\r
3825                     errln("FAIL: Builder.setLanguageTag should throw an exception for input tag [" + tag + "]");\r
3826                 }\r
3827             } catch (IllformedLocaleException ifle) {\r
3828                 if (ifle.getErrorIndex() != errorIdx) {\r
3829                     errln("FAIL: Builder.setLanguageTag returned error index " + ifle.getErrorIndex()\r
3830                             + " for input language tag [" + tag + "] expected: " + errorIdx);\r
3831                 }\r
3832             }\r
3833         }\r
3834     }\r
3835 \r
3836     /*\r
3837      * Test that if you use any locale without keyword that you will get a NULL\r
3838      * string returned and not throw and exception.\r
3839      */\r
3840     public void Test4735()\r
3841     {\r
3842         try {\r
3843             new ULocale("und").getDisplayKeywordValue("calendar",ULocale.GERMAN);\r
3844             new ULocale("en").getDisplayKeywordValue("calendar",ULocale.GERMAN);\r
3845         } catch (Exception e) {\r
3846             errln("Unexpected exception: " + e.getMessage());\r
3847         }  \r
3848     }\r
3849 \r
3850     public void TestGetFallback() {\r
3851         // Testing static String getFallback(String)\r
3852         final String[][] TESTIDS =\r
3853         {\r
3854             {"en_US", "en", "", ""},    // ULocale.getFallback("") should return ""\r
3855             {"EN_us_Var", "en_US", "en", ""},   // Case is always normalized\r
3856             {"de_DE@collation=phonebook", "de@collation=phonebook", "@collation=phonebook", "@collation=phonebook"},    // Keyword is preserved\r
3857             {"en__POSIX", "en", ""},    // Trailing empty segment should be truncated\r
3858             {"_US_POSIX", "_US", ""},   // Same as above\r
3859             {"root", ""},               // No canonicalization\r
3860         };\r
3861 \r
3862         for (String[] chain : TESTIDS) {\r
3863             for (int i = 1; i < chain.length; i++) {\r
3864                 String fallback = ULocale.getFallback(chain[i-1]);\r
3865                 assertEquals("getFallback(\"" + chain[i-1] + "\")", chain[i], fallback);\r
3866             }\r
3867         }\r
3868 \r
3869         // Testing ULocale getFallback()\r
3870         final ULocale[][] TESTLOCALES = \r
3871         {\r
3872             {new ULocale("en_US"), new ULocale("en"), ULocale.ROOT, null},\r
3873             {new ULocale("en__POSIX"), new ULocale("en"), ULocale.ROOT, null},\r
3874             {new ULocale("de_DE@collation=phonebook"), new ULocale("de@collation=phonebook"), new ULocale("@collation=phonebook"), null},\r
3875             {new ULocale("_US_POSIX"), new ULocale("_US"), ULocale.ROOT, null},\r
3876             {new ULocale("root"), ULocale.ROOT, null},\r
3877         };\r
3878 \r
3879         for(ULocale[] chain : TESTLOCALES) {\r
3880             for (int i = 1; i < chain.length; i++) {\r
3881                 ULocale fallback = chain[i-1].getFallback();\r
3882                 assertEquals("ULocale(" + chain[i-1] + ").getFallback()", chain[i], fallback);\r
3883             }\r
3884         }\r
3885     }\r
3886 }\r