OLD | NEW |
| (Empty) |
1 /******************************************************************** | |
2 * COPYRIGHT: | |
3 * Copyright (c) 1997-2015, International Business Machines Corporation and | |
4 * others. All Rights Reserved. | |
5 ********************************************************************/ | |
6 /***************************************************************************** | |
7 * | |
8 * File CLOCTST.C | |
9 * | |
10 * Modification History: | |
11 * Name Description | |
12 * Madhu Katragadda Ported for C API | |
13 ****************************************************************************** | |
14 */ | |
15 #include "cloctst.h" | |
16 #include <stdlib.h> | |
17 #include <stdio.h> | |
18 #include <string.h> | |
19 #include "cintltst.h" | |
20 #include "cstring.h" | |
21 #include "uparse.h" | |
22 #include "uresimp.h" | |
23 | |
24 #include "unicode/putil.h" | |
25 #include "unicode/ubrk.h" | |
26 #include "unicode/uchar.h" | |
27 #include "unicode/ucol.h" | |
28 #include "unicode/udat.h" | |
29 #include "unicode/uloc.h" | |
30 #include "unicode/umsg.h" | |
31 #include "unicode/ures.h" | |
32 #include "unicode/uset.h" | |
33 #include "unicode/ustring.h" | |
34 #include "unicode/utypes.h" | |
35 #include "unicode/ulocdata.h" | |
36 #include "unicode/uldnames.h" | |
37 #include "unicode/parseerr.h" /* may not be included with some uconfig switches
*/ | |
38 #include "udbgutil.h" | |
39 | |
40 static void TestNullDefault(void); | |
41 static void TestNonexistentLanguageExemplars(void); | |
42 static void TestLocDataErrorCodeChaining(void); | |
43 static void TestLanguageExemplarsFallbacks(void); | |
44 static void TestDisplayNameBrackets(void); | |
45 | |
46 static void TestUnicodeDefines(void); | |
47 | |
48 static void TestIsRightToLeft(void); | |
49 | |
50 void PrintDataTable(); | |
51 | |
52 /*--------------------------------------------------- | |
53 table of valid data | |
54 --------------------------------------------------- */ | |
55 #define LOCALE_SIZE 9 | |
56 #define LOCALE_INFO_SIZE 28 | |
57 | |
58 static const char* const rawData2[LOCALE_INFO_SIZE][LOCALE_SIZE] = { | |
59 /* language code */ | |
60 { "en", "fr", "ca", "el", "no", "zh", "de", "es", "ja" }
, | |
61 /* script code */ | |
62 { "", "", "", "", "", "", "", "", "" }, | |
63 /* country code */ | |
64 { "US", "FR", "ES", "GR", "NO", "CN", "DE", "", "JP" }, | |
65 /* variant code */ | |
66 { "", "", "", "", "NY", "", "", "", "" }, | |
67 /* full name */ | |
68 { "en_US", "fr_FR", "ca_ES", | |
69 "el_GR", "no_NO_NY", "zh_Hans_CN", | |
70 "de_DE@collation=phonebook", "es@collation=traditional", "ja_JP@calenda
r=japanese" }, | |
71 /* ISO-3 language */ | |
72 { "eng", "fra", "cat", "ell", "nor", "zho", "deu", "spa", "jpn" }, | |
73 /* ISO-3 country */ | |
74 { "USA", "FRA", "ESP", "GRC", "NOR", "CHN", "DEU", "", "JPN" }, | |
75 /* LCID */ | |
76 { "409", "40c", "403", "408", "814", "804", "10407", "40a", "411" }, | |
77 | |
78 /* display language (English) */ | |
79 { "English", "French", "Catalan", "Greek", "Norwegian", "Chinese", "
German", "Spanish", "Japanese" }, | |
80 /* display script code (English) */ | |
81 { "", "", "", "", "", "Simplified Han", "", "", ""
}, | |
82 /* display country (English) */ | |
83 { "United States", "France", "Spain", "Greece", "Norway", "China",
"Germany", "", "Japan" }, | |
84 /* display variant (English) */ | |
85 { "", "", "", "", "NY", "", "", "", "" }, | |
86 /* display name (English) */ | |
87 { "English (United States)", "French (France)", "Catalan (Spain)", | |
88 "Greek (Greece)", "Norwegian (Norway, NY)", "Chinese (Simplified, China)
", | |
89 "German (Germany, Sort Order=Phonebook Sort Order)", "Spanish (Sort Orde
r=Traditional Sort Order)", "Japanese (Japan, Calendar=Japanese Calendar)" }, | |
90 | |
91 /* display language (French) */ | |
92 { "anglais", "fran\\u00E7ais", "catalan", "grec", "norv\\u00E9gien",
"chinois", "allemand", "espagnol", "japonais" }, | |
93 /* display script code (French) */ | |
94 { "", "", "", "", "", "sinogrammes simplifi\\u00e9s",
"", "", "" }, | |
95 /* display country (French) */ | |
96 { "\\u00C9tats-Unis", "France", "Espagne", "Gr\\u00E8ce", "Norv\\u
00E8ge", "Chine", "Allemagne", "", "Japon" }, | |
97 /* display variant (French) */ | |
98 { "", "", "", "", "NY", "", "", "", "" }, | |
99 /* display name (French) */ | |
100 { "anglais (\\u00C9tats-Unis)", "fran\\u00E7ais (France)", "catalan (Espag
ne)", | |
101 "grec (Gr\\u00E8ce)", "norv\\u00E9gien (Norv\\u00E8ge, NY)", "chinois (
simplifi\\u00e9, Chine)", | |
102 "allemand (Allemagne, ordre de tri=Ordre de l\\u2019annuaire)", "espagno
l (ordre de tri=Ordre traditionnel)", "japonais (Japon, calendrier=calendrier ja
ponais)" }, | |
103 | |
104 /* display language (Catalan) */ | |
105 { "angl\\u00E8s", "franc\\u00E8s", "catal\\u00E0", "grec", "noruec", "xin
\\u00E8s", "alemany", "espanyol", "japon\\u00E8s" }, | |
106 /* display script code (Catalan) */ | |
107 { "", "", "", "", "", "han simplificat", "", "", ""
}, | |
108 /* display country (Catalan) */ | |
109 { "Estats Units", "Fran\\u00E7a", "Espanya", "Gr\\u00E8cia", "Noruega",
"Xina", "Alemanya", "", "Jap\\u00F3" }, | |
110 /* display variant (Catalan) */ | |
111 { "", "", "", "", "NY", "", "", "", "" }, | |
112 /* display name (Catalan) */ | |
113 { "angl\\u00E8s (Estats Units)", "franc\\u00E8s (Fran\\u00E7a)", "catal\\u
00E0 (Espanya)", | |
114 "grec (Gr\\u00E8cia)", "noruec (Noruega, NY)", "xin\\u00E8s (simplificat, Xi
na)", | |
115 "alemany (Alemanya, ordenaci\\u00F3=ordre de la guia telef\\u00F2nica)", "es
panyol (ordenaci\\u00F3=ordre tradicional)", "japon\\u00E8s (Jap\\u00F3, calenda
ri=calendari japon\\u00e8s)" }, | |
116 | |
117 /* display language (Greek) */ | |
118 { | |
119 "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac", | |
120 "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac", | |
121 "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac"
, | |
122 "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac", | |
123 "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac", | |
124 "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC", | |
125 "\\u0393\\u03B5\\u03C1\\u03BC\\u03B1\\u03BD\\u03B9\\u03BA\\u03AC", | |
126 "\\u0399\\u03C3\\u03C0\\u03B1\\u03BD\\u03B9\\u03BA\\u03AC", | |
127 "\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03B9\\u03BA\\u03AC" | |
128 }, | |
129 /* display script code (Greek) */ | |
130 | |
131 { "", "", "", "", "", "\\u0391\\u03c0\\u03bb\\u03bf\\u03c0
\\u03bf\\u03b9\\u03b7\\u03bc\\u03ad\\u03bd\\u03bf \\u03a7\\u03b1\\u03bd", "", ""
, "" }, | |
132 /* display country (Greek) */ | |
133 { | |
134 "\\u0397\\u03BD\\u03C9\\u03BC\\u03AD\\u03BD\\u03B5\\u03C2 \\u03A0\\u03BF
\\u03BB\\u03B9\\u03C4\\u03B5\\u03AF\\u03B5\\u03C2", | |
135 "\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1", | |
136 "\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1", | |
137 "\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1", | |
138 "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1", | |
139 "\\u039A\\u03AF\\u03BD\\u03B1", | |
140 "\\u0393\\u03B5\\u03C1\\u03BC\\u03B1\\u03BD\\u03AF\\u03B1", | |
141 "", | |
142 "\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03AF\\u03B1" | |
143 }, | |
144 /* display variant (Greek) */ | |
145 { "", "", "", "", "NY", "", "", "", "" }, /* TODO: currently there is n
o translation for NY in Greek fix this test when we have it */ | |
146 /* display name (Greek) */ | |
147 { | |
148 "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac (\\u0397\\u03BD\\u03C
9\\u03BC\\u03AD\\u03BD\\u03B5\\u03C2 \\u03A0\\u03BF\\u03BB\\u03B9\\u03C4\\u03B5\
\u03AF\\u03B5\\u03C2)", | |
149 "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac (\\u0393\\u03b1\\u03b
b\\u03bb\\u03af\\u03b1)", | |
150 "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac
(\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1)", | |
151 "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac (\\u0395\\u03b
b\\u03bb\\u03ac\\u03b4\\u03b1)", | |
152 "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac (\\u039
d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1, NY)", | |
153 "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC (\\u0391\\u03c
0\\u03bb\\u03bf\\u03c0\\u03bf\\u03b9\\u03b7\\u03bc\\u03ad\\u03bd\\u03bf, \\u039A
\\u03AF\\u03BD\\u03B1)", | |
154 "\\u0393\\u03b5\\u03c1\\u03bc\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u039
3\\u03b5\\u03c1\\u03bc\\u03b1\\u03bd\\u03af\\u03b1, \\u03a3\\u03b5\\u03b9\\u03c1
\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03c3\\u03b7\\
u03c2=\\u03a3\\u03b5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u
03cc\\u03bc\\u03b7\\u03c3\\u03b7\\u03c2 \\u03c4\\u03b7\\u03bb\\u03b5\\u03c6\\u03
c9\\u03bd\\u03b9\\u03ba\\u03bf\\u03cd \\u03ba\\u03b1\\u03c4\\u03b1\\u03bb\\u03cc
\\u03b3\\u03bf\\u03c5)", | |
155 "\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u03a3\\u03b
5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\
\u03c3\\u03b7\\u03c2=\\u03a0\\u03b1\\u03c1\\u03b1\\u03b4\\u03bf\\u03c3\\u03b9\\u
03b1\\u03ba\\u03ae \\u03c3\\u03b5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u0
3b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03c3\\u03b7\\u03c2)", | |
156 "\\u0399\\u03b1\\u03c0\\u03c9\\u03bd\\u03b9\\u03ba\\u03ac (\\u0399\\u03b
1\\u03c0\\u03c9\\u03bd\\u03af\\u03b1, \\u0397\\u03bc\\u03b5\\u03c1\\u03bf\\u03bb
\\u03cc\\u03b3\\u03b9\\u03bf=\\u0399\\u03b1\\u03c0\\u03c9\\u03bd\\u03b9\\u03ba\\
u03cc \\u03b7\\u03bc\\u03b5\\u03c1\\u03bf\\u03bb\\u03cc\\u03b3\\u03b9\\u03bf)" | |
157 } | |
158 }; | |
159 | |
160 static UChar*** dataTable=0; | |
161 enum { | |
162 ENGLISH = 0, | |
163 FRENCH = 1, | |
164 CATALAN = 2, | |
165 GREEK = 3, | |
166 NORWEGIAN = 4 | |
167 }; | |
168 | |
169 enum { | |
170 LANG = 0, | |
171 SCRIPT = 1, | |
172 CTRY = 2, | |
173 VAR = 3, | |
174 NAME = 4, | |
175 LANG3 = 5, | |
176 CTRY3 = 6, | |
177 LCID = 7, | |
178 DLANG_EN = 8, | |
179 DSCRIPT_EN = 9, | |
180 DCTRY_EN = 10, | |
181 DVAR_EN = 11, | |
182 DNAME_EN = 12, | |
183 DLANG_FR = 13, | |
184 DSCRIPT_FR = 14, | |
185 DCTRY_FR = 15, | |
186 DVAR_FR = 16, | |
187 DNAME_FR = 17, | |
188 DLANG_CA = 18, | |
189 DSCRIPT_CA = 19, | |
190 DCTRY_CA = 20, | |
191 DVAR_CA = 21, | |
192 DNAME_CA = 22, | |
193 DLANG_EL = 23, | |
194 DSCRIPT_EL = 24, | |
195 DCTRY_EL = 25, | |
196 DVAR_EL = 26, | |
197 DNAME_EL = 27 | |
198 }; | |
199 | |
200 #define TESTCASE(name) addTest(root, &name, "tsutil/cloctst/" #name) | |
201 | |
202 void addLocaleTest(TestNode** root); | |
203 | |
204 void addLocaleTest(TestNode** root) | |
205 { | |
206 TESTCASE(TestObsoleteNames); /* srl- move */ | |
207 TESTCASE(TestBasicGetters); | |
208 TESTCASE(TestNullDefault); | |
209 TESTCASE(TestPrefixes); | |
210 TESTCASE(TestSimpleResourceInfo); | |
211 TESTCASE(TestDisplayNames); | |
212 TESTCASE(TestGetAvailableLocales); | |
213 TESTCASE(TestDataDirectory); | |
214 #if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION | |
215 TESTCASE(TestISOFunctions); | |
216 #endif | |
217 TESTCASE(TestISO3Fallback); | |
218 TESTCASE(TestUninstalledISO3Names); | |
219 TESTCASE(TestSimpleDisplayNames); | |
220 TESTCASE(TestVariantParsing); | |
221 TESTCASE(TestKeywordVariants); | |
222 TESTCASE(TestKeywordVariantParsing); | |
223 TESTCASE(TestCanonicalization); | |
224 TESTCASE(TestKeywordSet); | |
225 TESTCASE(TestKeywordSetError); | |
226 TESTCASE(TestDisplayKeywords); | |
227 TESTCASE(TestDisplayKeywordValues); | |
228 TESTCASE(TestGetBaseName); | |
229 #if !UCONFIG_NO_FILE_IO | |
230 TESTCASE(TestGetLocale); | |
231 #endif | |
232 TESTCASE(TestDisplayNameWarning); | |
233 TESTCASE(TestNonexistentLanguageExemplars); | |
234 TESTCASE(TestLocDataErrorCodeChaining); | |
235 TESTCASE(TestLanguageExemplarsFallbacks); | |
236 TESTCASE(TestCalendar); | |
237 TESTCASE(TestDateFormat); | |
238 TESTCASE(TestCollation); | |
239 TESTCASE(TestULocale); | |
240 TESTCASE(TestUResourceBundle); | |
241 TESTCASE(TestDisplayName); | |
242 TESTCASE(TestAcceptLanguage); | |
243 TESTCASE(TestGetLocaleForLCID); | |
244 TESTCASE(TestOrientation); | |
245 TESTCASE(TestLikelySubtags); | |
246 TESTCASE(TestToLanguageTag); | |
247 TESTCASE(TestForLanguageTag); | |
248 TESTCASE(TestTrailingNull); | |
249 TESTCASE(TestUnicodeDefines); | |
250 TESTCASE(TestEnglishExemplarCharacters); | |
251 TESTCASE(TestDisplayNameBrackets); | |
252 TESTCASE(TestIsRightToLeft); | |
253 TESTCASE(TestToUnicodeLocaleKey); | |
254 TESTCASE(TestToLegacyKey); | |
255 TESTCASE(TestToUnicodeLocaleType); | |
256 TESTCASE(TestToLegacyType); | |
257 } | |
258 | |
259 | |
260 /* testing uloc(), uloc_getName(), uloc_getLanguage(), uloc_getVariant(), uloc_g
etCountry() */ | |
261 static void TestBasicGetters() { | |
262 int32_t i; | |
263 int32_t cap; | |
264 UErrorCode status = U_ZERO_ERROR; | |
265 char *testLocale = 0; | |
266 char *temp = 0, *name = 0; | |
267 log_verbose("Testing Basic Getters\n"); | |
268 for (i = 0; i < LOCALE_SIZE; i++) { | |
269 testLocale=(char*)malloc(sizeof(char) * (strlen(rawData2[NAME][i])+1)); | |
270 strcpy(testLocale,rawData2[NAME][i]); | |
271 | |
272 log_verbose("Testing %s .....\n", testLocale); | |
273 cap=uloc_getLanguage(testLocale, NULL, 0, &status); | |
274 if(status==U_BUFFER_OVERFLOW_ERROR){ | |
275 status=U_ZERO_ERROR; | |
276 temp=(char*)malloc(sizeof(char) * (cap+1)); | |
277 uloc_getLanguage(testLocale, temp, cap+1, &status); | |
278 } | |
279 if(U_FAILURE(status)){ | |
280 log_err("ERROR: in uloc_getLanguage %s\n", myErrorName(status)); | |
281 } | |
282 if (0 !=strcmp(temp,rawData2[LANG][i])) { | |
283 log_err(" Language code mismatch: %s versus %s\n", temp, rawData2[
LANG][i]); | |
284 } | |
285 | |
286 | |
287 cap=uloc_getCountry(testLocale, temp, cap, &status); | |
288 if(status==U_BUFFER_OVERFLOW_ERROR){ | |
289 status=U_ZERO_ERROR; | |
290 temp=(char*)realloc(temp, sizeof(char) * (cap+1)); | |
291 uloc_getCountry(testLocale, temp, cap+1, &status); | |
292 } | |
293 if(U_FAILURE(status)){ | |
294 log_err("ERROR: in uloc_getCountry %s\n", myErrorName(status)); | |
295 } | |
296 if (0 != strcmp(temp, rawData2[CTRY][i])) { | |
297 log_err(" Country code mismatch: %s versus %s\n", temp, rawData2
[CTRY][i]); | |
298 | |
299 } | |
300 | |
301 cap=uloc_getVariant(testLocale, temp, cap, &status); | |
302 if(status==U_BUFFER_OVERFLOW_ERROR){ | |
303 status=U_ZERO_ERROR; | |
304 temp=(char*)realloc(temp, sizeof(char) * (cap+1)); | |
305 uloc_getVariant(testLocale, temp, cap+1, &status); | |
306 } | |
307 if(U_FAILURE(status)){ | |
308 log_err("ERROR: in uloc_getVariant %s\n", myErrorName(status)); | |
309 } | |
310 if (0 != strcmp(temp, rawData2[VAR][i])) { | |
311 log_err("Variant code mismatch: %s versus %s\n", temp, rawData2[
VAR][i]); | |
312 } | |
313 | |
314 cap=uloc_getName(testLocale, NULL, 0, &status); | |
315 if(status==U_BUFFER_OVERFLOW_ERROR){ | |
316 status=U_ZERO_ERROR; | |
317 name=(char*)malloc(sizeof(char) * (cap+1)); | |
318 uloc_getName(testLocale, name, cap+1, &status); | |
319 } else if(status==U_ZERO_ERROR) { | |
320 log_err("ERROR: in uloc_getName(%s,NULL,0,..), expected U_BUFFER_OVERF
LOW_ERROR!\n", testLocale); | |
321 } | |
322 if(U_FAILURE(status)){ | |
323 log_err("ERROR: in uloc_getName %s\n", myErrorName(status)); | |
324 } | |
325 if (0 != strcmp(name, rawData2[NAME][i])){ | |
326 log_err(" Mismatch in getName: %s versus %s\n", name, rawData2[N
AME][i]); | |
327 } | |
328 | |
329 free(temp); | |
330 free(name); | |
331 | |
332 free(testLocale); | |
333 } | |
334 } | |
335 | |
336 static void TestNullDefault() { | |
337 UErrorCode status = U_ZERO_ERROR; | |
338 char original[ULOC_FULLNAME_CAPACITY]; | |
339 | |
340 uprv_strcpy(original, uloc_getDefault()); | |
341 uloc_setDefault("qq_BLA", &status); | |
342 if (uprv_strcmp(uloc_getDefault(), "qq_BLA") != 0) { | |
343 log_err(" Mismatch in uloc_setDefault: qq_BLA versus %s\n", uloc_get
Default()); | |
344 } | |
345 uloc_setDefault(NULL, &status); | |
346 if (uprv_strcmp(uloc_getDefault(), original) != 0) { | |
347 log_err(" uloc_setDefault(NULL, &status) didn't get the default locale b
ack!\n"); | |
348 } | |
349 | |
350 { | |
351 /* Test that set & get of default locale work, and that | |
352 * default locales are cached and reused, and not overwritten. | |
353 */ | |
354 const char *n_en_US; | |
355 const char *n_fr_FR; | |
356 const char *n2_en_US; | |
357 | |
358 status = U_ZERO_ERROR; | |
359 uloc_setDefault("en_US", &status); | |
360 n_en_US = uloc_getDefault(); | |
361 if (strcmp(n_en_US, "en_US") != 0) { | |
362 log_err("Wrong result from uloc_getDefault(). Expected \"en_US\", g
ot \"%s\"\n", n_en_US); | |
363 } | |
364 | |
365 uloc_setDefault("fr_FR", &status); | |
366 n_fr_FR = uloc_getDefault(); | |
367 if (strcmp(n_en_US, "en_US") != 0) { | |
368 log_err("uloc_setDefault altered previously default string." | |
369 "Expected \"en_US\", got \"%s\"\n", n_en_US); | |
370 } | |
371 if (strcmp(n_fr_FR, "fr_FR") != 0) { | |
372 log_err("Wrong result from uloc_getDefault(). Expected \"fr_FR\", g
ot %s\n", n_fr_FR); | |
373 } | |
374 | |
375 uloc_setDefault("en_US", &status); | |
376 n2_en_US = uloc_getDefault(); | |
377 if (strcmp(n2_en_US, "en_US") != 0) { | |
378 log_err("Wrong result from uloc_getDefault(). Expected \"en_US\", g
ot \"%s\"\n", n_en_US); | |
379 } | |
380 if (n2_en_US != n_en_US) { | |
381 log_err("Default locale cache failed to reuse en_US locale.\n"); | |
382 } | |
383 | |
384 if (U_FAILURE(status)) { | |
385 log_err("Failure returned from uloc_setDefault - \"%s\"\n", u_errorN
ame(status)); | |
386 } | |
387 | |
388 } | |
389 | |
390 } | |
391 /* Test the i- and x- and @ and . functionality | |
392 */ | |
393 | |
394 #define PREFIXBUFSIZ 128 | |
395 | |
396 static void TestPrefixes() { | |
397 int row = 0; | |
398 int n; | |
399 const char *loc, *expected; | |
400 | |
401 static const char * const testData[][7] = | |
402 { | |
403 /* NULL canonicalize() column means "expect same as getName()" */ | |
404 {"sv", "", "FI", "AL", "sv-fi-al", "sv_FI_AL", NULL}, | |
405 {"en", "", "GB", "", "en-gb", "en_GB", NULL}, | |
406 {"i-hakka", "", "MT", "XEMXIJA", "i-hakka_MT_XEMXIJA", "i-hakka_MT_XEMXI
JA", NULL}, | |
407 {"i-hakka", "", "CN", "", "i-hakka_CN", "i-hakka_CN", NULL}, | |
408 {"i-hakka", "", "MX", "", "I-hakka_MX", "i-hakka_MX", NULL}, | |
409 {"x-klingon", "", "US", "SANJOSE", "X-KLINGON_us_SANJOSE", "x-klingon_US
_SANJOSE", NULL}, | |
410 | |
411 {"zh", "Hans", "", "PINYIN", "zh-Hans-pinyin", "zh_Hans__PINYIN", "zh_Ha
ns@collation=pinyin"}, | |
412 {"hy", "", "", "AREVMDA", "hy_AREVMDA", "hy__AREVMDA", NULL}, | |
413 | |
414 {"de", "", "", "1901", "de-1901", "de__1901", NULL}, | |
415 {"mr", "", "", "", "mr.utf8", "mr.utf8", "mr"}, | |
416 {"de", "", "TV", "", "de-tv.koi8r", "de_TV.koi8r", "de_TV"}, | |
417 {"x-piglatin", "", "ML", "", "x-piglatin_ML.MBE", "x-piglatin_ML.MBE", "
x-piglatin_ML"}, /* Multibyte English */ | |
418 {"i-cherokee", "","US", "", "i-Cherokee_US.utf7", "i-cherokee_US.utf7",
"i-cherokee_US"}, | |
419 {"x-filfli", "", "MT", "FILFLA", "x-filfli_MT_FILFLA.gb-18030", "x-filfl
i_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA"}, | |
420 {"no", "", "NO", "NY", "no-no-ny.utf32@B", "no_NO_NY.utf32@B", "no_NO_NY
_B"}, | |
421 {"no", "", "NO", "", "no-no.utf32@B", "no_NO.utf32@B", "no_NO_B"}, | |
422 {"no", "", "", "NY", "no__ny", "no__NY", NULL}, | |
423 {"no", "", "", "", "no@ny", "no@ny", "no__NY"}, | |
424 {"el", "Latn", "", "", "el-latn", "el_Latn", NULL}, | |
425 {"en", "Cyrl", "RU", "", "en-cyrl-ru", "en_Cyrl_RU", NULL}, | |
426 {"zh", "Hant", "TW", "STROKE", "zh-hant_TW_STROKE", "zh_Hant_TW_STROKE",
"zh_Hant_TW@collation=stroke"}, | |
427 {"qq", "Qqqq", "QQ", "QQ", "qq_Qqqq_QQ_QQ", "qq_Qqqq_QQ_QQ", NULL}, | |
428 {"qq", "Qqqq", "", "QQ", "qq_Qqqq__QQ", "qq_Qqqq__QQ", NULL}, | |
429 {"ab", "Cdef", "GH", "IJ", "ab_cdef_gh_ij", "ab_Cdef_GH_IJ", NULL}, /* t
otal garbage */ | |
430 | |
431 {NULL,NULL,NULL,NULL,NULL,NULL,NULL} | |
432 }; | |
433 | |
434 static const char * const testTitles[] = { | |
435 "uloc_getLanguage()", | |
436 "uloc_getScript()", | |
437 "uloc_getCountry()", | |
438 "uloc_getVariant()", | |
439 "name", | |
440 "uloc_getName()", | |
441 "uloc_canonicalize()" | |
442 }; | |
443 | |
444 char buf[PREFIXBUFSIZ]; | |
445 int32_t len; | |
446 UErrorCode err; | |
447 | |
448 | |
449 for(row=0;testData[row][0] != NULL;row++) { | |
450 loc = testData[row][NAME]; | |
451 log_verbose("Test #%d: %s\n", row, loc); | |
452 | |
453 err = U_ZERO_ERROR; | |
454 len=0; | |
455 buf[0]=0; | |
456 for(n=0;n<=(NAME+2);n++) { | |
457 if(n==NAME) continue; | |
458 | |
459 for(len=0;len<PREFIXBUFSIZ;len++) { | |
460 buf[len] = '%'; /* Set a tripwire.. */ | |
461 } | |
462 len = 0; | |
463 | |
464 switch(n) { | |
465 case LANG: | |
466 len = uloc_getLanguage(loc, buf, PREFIXBUFSIZ, &err); | |
467 break; | |
468 | |
469 case SCRIPT: | |
470 len = uloc_getScript(loc, buf, PREFIXBUFSIZ, &err); | |
471 break; | |
472 | |
473 case CTRY: | |
474 len = uloc_getCountry(loc, buf, PREFIXBUFSIZ, &err); | |
475 break; | |
476 | |
477 case VAR: | |
478 len = uloc_getVariant(loc, buf, PREFIXBUFSIZ, &err); | |
479 break; | |
480 | |
481 case NAME+1: | |
482 len = uloc_getName(loc, buf, PREFIXBUFSIZ, &err); | |
483 break; | |
484 | |
485 case NAME+2: | |
486 len = uloc_canonicalize(loc, buf, PREFIXBUFSIZ, &err); | |
487 break; | |
488 | |
489 default: | |
490 strcpy(buf, "**??"); | |
491 len=4; | |
492 } | |
493 | |
494 if(U_FAILURE(err)) { | |
495 log_err("#%d: %s on %s: err %s\n", | |
496 row, testTitles[n], loc, u_errorName(err)); | |
497 } else { | |
498 log_verbose("#%d: %s on %s: -> [%s] (length %d)\n", | |
499 row, testTitles[n], loc, buf, len); | |
500 | |
501 if(len != (int32_t)strlen(buf)) { | |
502 log_err("#%d: %s on %s: -> [%s] (length returned %d, actual
%d!)\n", | |
503 row, testTitles[n], loc, buf, len, strlen(buf)+1); | |
504 | |
505 } | |
506 | |
507 /* see if they smashed something */ | |
508 if(buf[len+1] != '%') { | |
509 log_err("#%d: %s on %s: -> [%s] - wrote [%X] out ofbounds!\n
", | |
510 row, testTitles[n], loc, buf, buf[len+1]); | |
511 } | |
512 | |
513 expected = testData[row][n]; | |
514 if (expected == NULL && n == (NAME+2)) { | |
515 /* NULL expected canonicalize() means "expect same as getNam
e()" */ | |
516 expected = testData[row][NAME+1]; | |
517 } | |
518 if(strcmp(buf, expected)) { | |
519 log_err("#%d: %s on %s: -> [%s] (expected '%s'!)\n", | |
520 row, testTitles[n], loc, buf, expected); | |
521 | |
522 } | |
523 } | |
524 } | |
525 } | |
526 } | |
527 | |
528 | |
529 /* testing uloc_getISO3Language(), uloc_getISO3Country(), */ | |
530 static void TestSimpleResourceInfo() { | |
531 int32_t i; | |
532 char* testLocale = 0; | |
533 UChar* expected = 0; | |
534 | |
535 const char* temp; | |
536 char temp2[20]; | |
537 testLocale=(char*)malloc(sizeof(char) * 1); | |
538 expected=(UChar*)malloc(sizeof(UChar) * 1); | |
539 | |
540 setUpDataTable(); | |
541 log_verbose("Testing getISO3Language and getISO3Country\n"); | |
542 for (i = 0; i < LOCALE_SIZE; i++) { | |
543 | |
544 testLocale=(char*)realloc(testLocale, sizeof(char) * (u_strlen(dataTable
[NAME][i])+1)); | |
545 u_austrcpy(testLocale, dataTable[NAME][i]); | |
546 | |
547 log_verbose("Testing %s ......\n", testLocale); | |
548 | |
549 temp=uloc_getISO3Language(testLocale); | |
550 expected=(UChar*)realloc(expected, sizeof(UChar) * (strlen(temp) + 1)); | |
551 u_uastrcpy(expected,temp); | |
552 if (0 != u_strcmp(expected, dataTable[LANG3][i])) { | |
553 log_err(" ISO-3 language code mismatch: %s versus %s\n", austrdu
p(expected), | |
554 austrdup(dataTable[LANG3][i])); | |
555 } | |
556 | |
557 temp=uloc_getISO3Country(testLocale); | |
558 expected=(UChar*)realloc(expected, sizeof(UChar) * (strlen(temp) + 1)); | |
559 u_uastrcpy(expected,temp); | |
560 if (0 != u_strcmp(expected, dataTable[CTRY3][i])) { | |
561 log_err(" ISO-3 Country code mismatch: %s versus %s\n", austrdup
(expected), | |
562 austrdup(dataTable[CTRY3][i])); | |
563 } | |
564 sprintf(temp2, "%x", (int)uloc_getLCID(testLocale)); | |
565 if (strcmp(temp2, rawData2[LCID][i]) != 0) { | |
566 log_err("LCID mismatch: %s versus %s\n", temp2 , rawData2[LCID][i]); | |
567 } | |
568 } | |
569 | |
570 free(expected); | |
571 free(testLocale); | |
572 cleanUpDataTable(); | |
573 } | |
574 | |
575 /* if len < 0, we convert until we hit UChar 0x0000, which is not output. will a
dd trailing null | |
576 * if there's room but won't be included in result. result < 0 indicates an err
or. | |
577 * Returns the number of chars written (not those that would be written if there
's enough room.*/ | |
578 static int32_t UCharsToEscapedAscii(const UChar* utext, int32_t len, char* resul
tChars, int32_t buflen) { | |
579 static const struct { | |
580 char escapedChar; | |
581 UChar sourceVal; | |
582 } ESCAPE_MAP[] = { | |
583 /*a*/ {'a', 0x07}, | |
584 /*b*/ {'b', 0x08}, | |
585 /*e*/ {'e', 0x1b}, | |
586 /*f*/ {'f', 0x0c}, | |
587 /*n*/ {'n', 0x0a}, | |
588 /*r*/ {'r', 0x0d}, | |
589 /*t*/ {'t', 0x09}, | |
590 /*v*/ {'v', 0x0b} | |
591 }; | |
592 static const int32_t ESCAPE_MAP_LENGTH = sizeof(ESCAPE_MAP)/sizeof(ESCAPE_MA
P[0]); | |
593 static const char HEX_DIGITS[] = { | |
594 '0', '1', '2', '3', '4', '5', '6', '7', | |
595 '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' | |
596 }; | |
597 int32_t i, j; | |
598 int32_t resultLen = 0; | |
599 const int32_t limit = len<0 ? buflen : len; /* buflen is long enough to hit
the buffer limit */ | |
600 const int32_t escapeLimit1 = buflen-2; | |
601 const int32_t escapeLimit2 = buflen-6; | |
602 UChar uc; | |
603 | |
604 if(utext==NULL || resultChars==NULL || buflen<0) { | |
605 return -1; | |
606 } | |
607 | |
608 for(i=0;i<limit && resultLen<buflen;++i) { | |
609 uc=utext[i]; | |
610 if(len<0 && uc==0) { | |
611 break; | |
612 } | |
613 if(uc<0x20) { | |
614 for(j=0;j<ESCAPE_MAP_LENGTH && uc!=ESCAPE_MAP[j].sourceVal;j++) { | |
615 } | |
616 if(j<ESCAPE_MAP_LENGTH) { | |
617 if(resultLen>escapeLimit1) { | |
618 break; | |
619 } | |
620 resultChars[resultLen++]='\\'; | |
621 resultChars[resultLen++]=ESCAPE_MAP[j].escapedChar; | |
622 continue; | |
623 } | |
624 } else if(uc<0x7f) { | |
625 u_austrncpy(resultChars + resultLen, &uc, 1); | |
626 resultLen++; | |
627 continue; | |
628 } | |
629 | |
630 if(resultLen>escapeLimit2) { | |
631 break; | |
632 } | |
633 | |
634 /* have to escape the uchar */ | |
635 resultChars[resultLen++]='\\'; | |
636 resultChars[resultLen++]='u'; | |
637 resultChars[resultLen++]=HEX_DIGITS[(uc>>12)&0xff]; | |
638 resultChars[resultLen++]=HEX_DIGITS[(uc>>8)&0xff]; | |
639 resultChars[resultLen++]=HEX_DIGITS[(uc>>4)&0xff]; | |
640 resultChars[resultLen++]=HEX_DIGITS[uc&0xff]; | |
641 } | |
642 | |
643 if(resultLen<buflen) { | |
644 resultChars[resultLen] = 0; | |
645 } | |
646 | |
647 return resultLen; | |
648 } | |
649 | |
650 /* | |
651 * Jitterbug 2439 -- markus 20030425 | |
652 * | |
653 * The lookup of display names must not fall back through the default | |
654 * locale because that yields useless results. | |
655 */ | |
656 static void TestDisplayNames() | |
657 { | |
658 UChar buffer[100]; | |
659 UErrorCode errorCode=U_ZERO_ERROR; | |
660 int32_t length; | |
661 log_verbose("Testing getDisplayName for different locales\n"); | |
662 | |
663 log_verbose(" In locale = en_US...\n"); | |
664 doTestDisplayNames("en_US", DLANG_EN); | |
665 log_verbose(" In locale = fr_FR....\n"); | |
666 doTestDisplayNames("fr_FR", DLANG_FR); | |
667 log_verbose(" In locale = ca_ES...\n"); | |
668 doTestDisplayNames("ca_ES", DLANG_CA); | |
669 log_verbose(" In locale = gr_EL..\n"); | |
670 doTestDisplayNames("el_GR", DLANG_EL); | |
671 | |
672 /* test that the default locale has a display name for its own language */ | |
673 errorCode=U_ZERO_ERROR; | |
674 length=uloc_getDisplayLanguage(NULL, NULL, buffer, UPRV_LENGTHOF(buffer), &e
rrorCode); | |
675 if(U_FAILURE(errorCode) || (length<=3 && buffer[0]<=0x7f)) { | |
676 /* check <=3 to reject getting the language code as a display name */ | |
677 log_data_err("unable to get a display string for the language of the def
ault locale - %s (Are you missing data?)\n", u_errorName(errorCode)); | |
678 } | |
679 | |
680 /* test that we get the language code itself for an unknown language, and a
default warning */ | |
681 errorCode=U_ZERO_ERROR; | |
682 length=uloc_getDisplayLanguage("qq", "rr", buffer, UPRV_LENGTHOF(buffer), &e
rrorCode); | |
683 if(errorCode!=U_USING_DEFAULT_WARNING || length!=2 || buffer[0]!=0x71 || buf
fer[1]!=0x71) { | |
684 log_err("error getting the display string for an unknown language - %s\n
", u_errorName(errorCode)); | |
685 } | |
686 | |
687 /* test that we get a default warning for a display name where one component
is unknown (4255) */ | |
688 errorCode=U_ZERO_ERROR; | |
689 length=uloc_getDisplayName("qq_US_POSIX", "en_US", buffer, UPRV_LENGTHOF(buf
fer), &errorCode); | |
690 if(errorCode!=U_USING_DEFAULT_WARNING) { | |
691 log_err("error getting the display name for a locale with an unknown lan
guage - %s\n", u_errorName(errorCode)); | |
692 } | |
693 | |
694 { | |
695 int32_t i; | |
696 static const char *aLocale = "es@collation=traditional;calendar=japanese
"; | |
697 static const char *testL[] = { "en_US", | |
698 "fr_FR", | |
699 "ca_ES", | |
700 "el_GR" }; | |
701 static const char *expect[] = { "Spanish (Calendar=Japanese Calendar, So
rt Order=Traditional Sort Order)", /* note sorted order of keywords */ | |
702 "espagnol (calendrier=calendrier japonais, ordre de tri=Ordre tradit
ionnel)", | |
703 "espanyol (calendari=calendari japon\\u00e8s, ordenaci\\u00f3=ordre
tradicional)", | |
704 "\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u0397\\
u03bc\\u03b5\\u03c1\\u03bf\\u03bb\\u03cc\\u03b3\\u03b9\\u03bf=\\u0399\\u03b1\\u0
3c0\\u03c9\\u03bd\\u03b9\\u03ba\\u03cc \\u03b7\\u03bc\\u03b5\\u03c1\\u03bf\\u03b
b\\u03cc\\u03b3\\u03b9\\u03bf, \\u03a3\\u03b5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b
1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03c3\\u03b7\\u03c2=\\u03a0\\u03b1\
\u03c1\\u03b1\\u03b4\\u03bf\\u03c3\\u03b9\\u03b1\\u03ba\\u03ae \\u03c3\\u03b5\\u
03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03
c3\\u03b7\\u03c2)" }; | |
705 UChar *expectBuffer; | |
706 | |
707 for(i=0;i<UPRV_LENGTHOF(testL);i++) { | |
708 errorCode = U_ZERO_ERROR; | |
709 uloc_getDisplayName(aLocale, testL[i], buffer, UPRV_LENGTHOF(buffer)
, &errorCode); | |
710 if(U_FAILURE(errorCode)) { | |
711 log_err("FAIL in uloc_getDisplayName(%s,%s,..) -> %s\n", aLocale
, testL[i], u_errorName(errorCode)); | |
712 } else { | |
713 expectBuffer = CharsToUChars(expect[i]); | |
714 if(u_strcmp(buffer,expectBuffer)) { | |
715 log_data_err("FAIL in uloc_getDisplayName(%s,%s,..) expected
'%s' got '%s' (Are you missing data?)\n", aLocale, testL[i], expect[i], austrdu
p(buffer)); | |
716 } else { | |
717 log_verbose("pass in uloc_getDisplayName(%s,%s,..) got '%s'\
n", aLocale, testL[i], expect[i]); | |
718 } | |
719 free(expectBuffer); | |
720 } | |
721 } | |
722 } | |
723 | |
724 /* test that we properly preflight and return data when there's a non-defaul
t pattern, | |
725 see ticket #8262. */ | |
726 { | |
727 int32_t i; | |
728 static const char *locale="az_Cyrl"; | |
729 static const char *displayLocale="ja"; | |
730 static const char *expectedChars = | |
731 "\\u30a2\\u30bc\\u30eb\\u30d0\\u30a4\\u30b8\\u30e3\\u30f3\\u8a9e
" | |
732 "(\\u30ad\\u30ea\\u30eb\\u6587\\u5b57)"; | |
733 UErrorCode ec=U_ZERO_ERROR; | |
734 UChar result[256]; | |
735 int32_t len; | |
736 int32_t preflightLen=uloc_getDisplayName(locale, displayLocale, NULL, 0,
&ec); | |
737 /* inconvenient semantics when preflighting, this condition is expected.
.. */ | |
738 if(ec==U_BUFFER_OVERFLOW_ERROR) { | |
739 ec=U_ZERO_ERROR; | |
740 } | |
741 len=uloc_getDisplayName(locale, displayLocale, result, UPRV_LENGTHOF(res
ult), &ec); | |
742 if(U_FAILURE(ec)) { | |
743 log_err("uloc_getDisplayName(%s, %s...) returned error: %s", | |
744 locale, displayLocale, u_errorName(ec)); | |
745 } else { | |
746 UChar *expected=CharsToUChars(expectedChars); | |
747 int32_t expectedLen=u_strlen(expected); | |
748 | |
749 if(len!=expectedLen) { | |
750 log_data_err("uloc_getDisplayName(%s, %s...) returned string of
length %d, expected length %d", | |
751 locale, displayLocale, len, expectedLen); | |
752 } else if(preflightLen!=expectedLen) { | |
753 log_err("uloc_getDisplayName(%s, %s...) returned preflight lengt
h %d, expected length %d", | |
754 locale, displayLocale, preflightLen, expectedLen); | |
755 } else if(u_strncmp(result, expected, len)) { | |
756 int32_t cap=len*6+1; /* worst case + space for trailing null */ | |
757 char* resultChars=(char*)malloc(cap); | |
758 int32_t resultCharsLen=UCharsToEscapedAscii(result, len, resultC
hars, cap); | |
759 if(resultCharsLen<0 || resultCharsLen<cap-1) { | |
760 log_err("uloc_getDisplayName(%s, %s...) mismatch", locale, d
isplayLocale); | |
761 } else { | |
762 log_err("uloc_getDisplayName(%s, %s...) returned '%s' but ex
pected '%s'", | |
763 locale, displayLocale, resultChars, expectedChars); | |
764 } | |
765 free(resultChars); | |
766 resultChars=NULL; | |
767 } else { | |
768 /* test all buffer sizes */ | |
769 for(i=len+1;i>=0;--i) { | |
770 len=uloc_getDisplayName(locale, displayLocale, result, i, &e
c); | |
771 if(ec==U_BUFFER_OVERFLOW_ERROR) { | |
772 ec=U_ZERO_ERROR; | |
773 } | |
774 if(U_FAILURE(ec)) { | |
775 log_err("using buffer of length %d returned error %s", i
, u_errorName(ec)); | |
776 break; | |
777 } | |
778 if(len!=expectedLen) { | |
779 log_err("with buffer of length %d, expected length %d bu
t got %d", i, expectedLen, len); | |
780 break; | |
781 } | |
782 /* There's no guarantee about what's in the buffer if we've
overflowed, in particular, | |
783 * we don't know that it's been filled, so no point in check
ing. */ | |
784 } | |
785 } | |
786 | |
787 free(expected); | |
788 } | |
789 } | |
790 } | |
791 | |
792 | |
793 /* test for uloc_getAvialable() and uloc_countAvilable()*/ | |
794 static void TestGetAvailableLocales() | |
795 { | |
796 | |
797 const char *locList; | |
798 int32_t locCount,i; | |
799 | |
800 log_verbose("Testing the no of avialable locales\n"); | |
801 locCount=uloc_countAvailable(); | |
802 if (locCount == 0) | |
803 log_data_err("countAvailable() returned an empty list!\n"); | |
804 | |
805 /* use something sensible w/o hardcoding the count */ | |
806 else if(locCount < 0){ | |
807 log_data_err("countAvailable() returned a wrong value!= %d\n", locCount)
; | |
808 } | |
809 else{ | |
810 log_info("Number of locales returned = %d\n", locCount); | |
811 } | |
812 for(i=0;i<locCount;i++){ | |
813 locList=uloc_getAvailable(i); | |
814 | |
815 log_verbose(" %s\n", locList); | |
816 } | |
817 } | |
818 | |
819 /* test for u_getDataDirectory, u_setDataDirectory, uloc_getISO3Language */ | |
820 static void TestDataDirectory() | |
821 { | |
822 | |
823 char oldDirectory[512]; | |
824 const char *temp,*testValue1,*testValue2,*testValue3; | |
825 const char path[40] ="d:\\icu\\source\\test\\intltest" U_FILE_SEP_STRING; /*
give the required path */ | |
826 | |
827 log_verbose("Testing getDataDirectory()\n"); | |
828 temp = u_getDataDirectory(); | |
829 strcpy(oldDirectory, temp); | |
830 | |
831 testValue1=uloc_getISO3Language("en_US"); | |
832 log_verbose("first fetch of language retrieved %s\n", testValue1); | |
833 | |
834 if (0 != strcmp(testValue1,"eng")){ | |
835 log_err("Initial check of ISO3 language failed: expected \"eng\", got %
s \n", testValue1); | |
836 } | |
837 | |
838 /*defining the path for DataDirectory */ | |
839 log_verbose("Testing setDataDirectory\n"); | |
840 u_setDataDirectory( path ); | |
841 if(strcmp(path, u_getDataDirectory())==0) | |
842 log_verbose("setDataDirectory working fine\n"); | |
843 else | |
844 log_err("Error in setDataDirectory. Directory not set correctly - came b
ack as [%s], expected [%s]\n", u_getDataDirectory(), path); | |
845 | |
846 testValue2=uloc_getISO3Language("en_US"); | |
847 log_verbose("second fetch of language retrieved %s \n", testValue2); | |
848 | |
849 u_setDataDirectory(oldDirectory); | |
850 testValue3=uloc_getISO3Language("en_US"); | |
851 log_verbose("third fetch of language retrieved %s \n", testValue3); | |
852 | |
853 if (0 != strcmp(testValue3,"eng")) { | |
854 log_err("get/setDataDirectory() failed: expected \"eng\", got \" %s \" \
n", testValue3); | |
855 } | |
856 } | |
857 | |
858 | |
859 | |
860 /*=========================================================== */ | |
861 | |
862 static UChar _NUL=0; | |
863 | |
864 static void doTestDisplayNames(const char* displayLocale, int32_t compareIndex) | |
865 { | |
866 UErrorCode status = U_ZERO_ERROR; | |
867 int32_t i; | |
868 int32_t maxresultsize; | |
869 | |
870 const char *testLocale; | |
871 | |
872 | |
873 UChar *testLang = 0; | |
874 UChar *testScript = 0; | |
875 UChar *testCtry = 0; | |
876 UChar *testVar = 0; | |
877 UChar *testName = 0; | |
878 | |
879 | |
880 UChar* expectedLang = 0; | |
881 UChar* expectedScript = 0; | |
882 UChar* expectedCtry = 0; | |
883 UChar* expectedVar = 0; | |
884 UChar* expectedName = 0; | |
885 | |
886 setUpDataTable(); | |
887 | |
888 for(i=0;i<LOCALE_SIZE; ++i) | |
889 { | |
890 testLocale=rawData2[NAME][i]; | |
891 | |
892 log_verbose("Testing..... %s\n", testLocale); | |
893 | |
894 maxresultsize=0; | |
895 maxresultsize=uloc_getDisplayLanguage(testLocale, displayLocale, NULL, m
axresultsize, &status); | |
896 if(status==U_BUFFER_OVERFLOW_ERROR) | |
897 { | |
898 status=U_ZERO_ERROR; | |
899 testLang=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1)); | |
900 uloc_getDisplayLanguage(testLocale, displayLocale, testLang, maxresu
ltsize + 1, &status); | |
901 } | |
902 else | |
903 { | |
904 testLang=&_NUL; | |
905 } | |
906 if(U_FAILURE(status)){ | |
907 log_err("Error in getDisplayLanguage() %s\n", myErrorName(status)); | |
908 } | |
909 | |
910 maxresultsize=0; | |
911 maxresultsize=uloc_getDisplayScript(testLocale, displayLocale, NULL, max
resultsize, &status); | |
912 if(status==U_BUFFER_OVERFLOW_ERROR) | |
913 { | |
914 status=U_ZERO_ERROR; | |
915 testScript=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1)); | |
916 uloc_getDisplayScript(testLocale, displayLocale, testScript, maxresu
ltsize + 1, &status); | |
917 } | |
918 else | |
919 { | |
920 testScript=&_NUL; | |
921 } | |
922 if(U_FAILURE(status)){ | |
923 log_err("Error in getDisplayScript() %s\n", myErrorName(status)); | |
924 } | |
925 | |
926 maxresultsize=0; | |
927 maxresultsize=uloc_getDisplayCountry(testLocale, displayLocale, NULL, ma
xresultsize, &status); | |
928 if(status==U_BUFFER_OVERFLOW_ERROR) | |
929 { | |
930 status=U_ZERO_ERROR; | |
931 testCtry=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1)); | |
932 uloc_getDisplayCountry(testLocale, displayLocale, testCtry, maxresul
tsize + 1, &status); | |
933 } | |
934 else | |
935 { | |
936 testCtry=&_NUL; | |
937 } | |
938 if(U_FAILURE(status)){ | |
939 log_err("Error in getDisplayCountry() %s\n", myErrorName(status)); | |
940 } | |
941 | |
942 maxresultsize=0; | |
943 maxresultsize=uloc_getDisplayVariant(testLocale, displayLocale, NULL, ma
xresultsize, &status); | |
944 if(status==U_BUFFER_OVERFLOW_ERROR) | |
945 { | |
946 status=U_ZERO_ERROR; | |
947 testVar=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1)); | |
948 uloc_getDisplayVariant(testLocale, displayLocale, testVar, maxresult
size + 1, &status); | |
949 } | |
950 else | |
951 { | |
952 testVar=&_NUL; | |
953 } | |
954 if(U_FAILURE(status)){ | |
955 log_err("Error in getDisplayVariant() %s\n", myErrorName(status
)); | |
956 } | |
957 | |
958 maxresultsize=0; | |
959 maxresultsize=uloc_getDisplayName(testLocale, displayLocale, NULL, maxre
sultsize, &status); | |
960 if(status==U_BUFFER_OVERFLOW_ERROR) | |
961 { | |
962 status=U_ZERO_ERROR; | |
963 testName=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1)); | |
964 uloc_getDisplayName(testLocale, displayLocale, testName, maxresultsi
ze + 1, &status); | |
965 } | |
966 else | |
967 { | |
968 testName=&_NUL; | |
969 } | |
970 if(U_FAILURE(status)){ | |
971 log_err("Error in getDisplayName() %s\n", myErrorName(status)); | |
972 } | |
973 | |
974 expectedLang=dataTable[compareIndex][i]; | |
975 if(u_strlen(expectedLang)== 0) | |
976 expectedLang=dataTable[DLANG_EN][i]; | |
977 | |
978 expectedScript=dataTable[compareIndex + 1][i]; | |
979 if(u_strlen(expectedScript)== 0) | |
980 expectedScript=dataTable[DSCRIPT_EN][i]; | |
981 | |
982 expectedCtry=dataTable[compareIndex + 2][i]; | |
983 if(u_strlen(expectedCtry)== 0) | |
984 expectedCtry=dataTable[DCTRY_EN][i]; | |
985 | |
986 expectedVar=dataTable[compareIndex + 3][i]; | |
987 if(u_strlen(expectedVar)== 0) | |
988 expectedVar=dataTable[DVAR_EN][i]; | |
989 | |
990 expectedName=dataTable[compareIndex + 4][i]; | |
991 if(u_strlen(expectedName) == 0) | |
992 expectedName=dataTable[DNAME_EN][i]; | |
993 | |
994 if (0 !=u_strcmp(testLang,expectedLang)) { | |
995 log_data_err(" Display Language mismatch: got %s expected %s display
Locale=%s (Are you missing data?)\n", austrdup(testLang), austrdup(expectedLang)
, displayLocale); | |
996 } | |
997 | |
998 if (0 != u_strcmp(testScript,expectedScript)) { | |
999 log_data_err(" Display Script mismatch: got %s expected %s displayLo
cale=%s (Are you missing data?)\n", austrdup(testScript), austrdup(expectedScrip
t), displayLocale); | |
1000 } | |
1001 | |
1002 if (0 != u_strcmp(testCtry,expectedCtry)) { | |
1003 log_data_err(" Display Country mismatch: got %s expected %s displayL
ocale=%s (Are you missing data?)\n", austrdup(testCtry), austrdup(expectedCtry),
displayLocale); | |
1004 } | |
1005 | |
1006 if (0 != u_strcmp(testVar,expectedVar)) { | |
1007 log_data_err(" Display Variant mismatch: got %s expected %s displayL
ocale=%s (Are you missing data?)\n", austrdup(testVar), austrdup(expectedVar), d
isplayLocale); | |
1008 } | |
1009 | |
1010 if(0 != u_strcmp(testName, expectedName)) { | |
1011 log_data_err(" Display Name mismatch: got %s expected %s displayLoca
le=%s (Are you missing data?)\n", austrdup(testName), austrdup(expectedName), di
splayLocale); | |
1012 } | |
1013 | |
1014 if(testName!=&_NUL) { | |
1015 free(testName); | |
1016 } | |
1017 if(testLang!=&_NUL) { | |
1018 free(testLang); | |
1019 } | |
1020 if(testScript!=&_NUL) { | |
1021 free(testScript); | |
1022 } | |
1023 if(testCtry!=&_NUL) { | |
1024 free(testCtry); | |
1025 } | |
1026 if(testVar!=&_NUL) { | |
1027 free(testVar); | |
1028 } | |
1029 } | |
1030 cleanUpDataTable(); | |
1031 } | |
1032 | |
1033 /*------------------------------ | |
1034 * TestDisplayNameBrackets | |
1035 */ | |
1036 | |
1037 typedef struct { | |
1038 const char * displayLocale; | |
1039 const char * namedRegion; | |
1040 const char * namedLocale; | |
1041 const char * regionName; | |
1042 const char * localeName; | |
1043 } DisplayNameBracketsItem; | |
1044 | |
1045 static const DisplayNameBracketsItem displayNameBracketsItems[] = { | |
1046 { "en", "CC", "en_CC", "Cocos (Keeling) Islands", "English (Cocos [Kee
ling] Islands)" }, | |
1047 { "en", "MM", "my_MM", "Myanmar (Burma)", "Burmese (Myanmar [B
urma])" }, | |
1048 { "en", "MM", "my_Mymr_MM", "Myanmar (Burma)", "Burmese (Myanmar, M
yanmar [Burma])" }, | |
1049 { "zh", "CC", "en_CC", "\\u79D1\\u79D1\\u65AF\\uFF08\\u57FA\\u6797\\uFF
09\\u7FA4\\u5C9B", "\\u82F1\\u6587\\uFF08\\u79D1\\u79D1\\u65AF\\uFF3B\\u57FA\\u6
797\\uFF3D\\u7FA4\\u5C9B\\uFF09" }, | |
1050 { "zh", "CG", "fr_CG", "\\u521A\\u679C\\uFF08\\u5E03\\uFF09",
"\\u6CD5\\u6587\\uFF08\\u521A\\u679C\\uFF3B\\u5E03\\uFF3D\\uF
F09" }, | |
1051 { NULL, NULL, NULL, NULL, NULL
} | |
1052 }; | |
1053 | |
1054 enum { kDisplayNameBracketsMax = 128 }; | |
1055 | |
1056 static void TestDisplayNameBrackets() | |
1057 { | |
1058 const DisplayNameBracketsItem * itemPtr = displayNameBracketsItems; | |
1059 for (; itemPtr->displayLocale != NULL; itemPtr++) { | |
1060 ULocaleDisplayNames * uldn; | |
1061 UErrorCode status; | |
1062 UChar expectRegionName[kDisplayNameBracketsMax]; | |
1063 UChar expectLocaleName[kDisplayNameBracketsMax]; | |
1064 UChar getName[kDisplayNameBracketsMax]; | |
1065 int32_t ulen; | |
1066 | |
1067 (void) u_unescape(itemPtr->regionName, expectRegionName, kDisplayNameBra
cketsMax); | |
1068 (void) u_unescape(itemPtr->localeName, expectLocaleName, kDisplayNameBra
cketsMax); | |
1069 | |
1070 status = U_ZERO_ERROR; | |
1071 ulen = uloc_getDisplayCountry(itemPtr->namedLocale, itemPtr->displayLoca
le, getName, kDisplayNameBracketsMax, &status); | |
1072 if ( U_FAILURE(status) || u_strcmp(getName, expectRegionName) != 0 ) { | |
1073 log_data_err("uloc_getDisplayCountry for displayLocale %s and namedL
ocale %s returns unexpected name or status %s\n", itemPtr->displayLocale, itemPt
r->namedLocale, myErrorName(status)); | |
1074 } | |
1075 | |
1076 status = U_ZERO_ERROR; | |
1077 ulen = uloc_getDisplayName(itemPtr->namedLocale, itemPtr->displayLocale,
getName, kDisplayNameBracketsMax, &status); | |
1078 if ( U_FAILURE(status) || u_strcmp(getName, expectLocaleName) != 0 ) { | |
1079 log_data_err("uloc_getDisplayName for displayLocale %s and namedLoca
le %s returns unexpected name or status %s\n", itemPtr->displayLocale, itemPtr->
namedLocale, myErrorName(status)); | |
1080 } | |
1081 | |
1082 #if !UCONFIG_NO_FORMATTING | |
1083 status = U_ZERO_ERROR; | |
1084 uldn = uldn_open(itemPtr->displayLocale, ULDN_STANDARD_NAMES, &status); | |
1085 if (U_SUCCESS(status)) { | |
1086 status = U_ZERO_ERROR; | |
1087 ulen = uldn_regionDisplayName(uldn, itemPtr->namedRegion, getName, k
DisplayNameBracketsMax, &status); | |
1088 if ( U_FAILURE(status) || u_strcmp(getName, expectRegionName) != 0 )
{ | |
1089 log_data_err("uldn_regionDisplayName for displayLocale %s and na
medRegion %s returns unexpected name or status %s\n", itemPtr->displayLocale, it
emPtr->namedRegion, myErrorName(status)); | |
1090 } | |
1091 | |
1092 status = U_ZERO_ERROR; | |
1093 ulen = uldn_localeDisplayName(uldn, itemPtr->namedLocale, getName, k
DisplayNameBracketsMax, &status); | |
1094 if ( U_FAILURE(status) || u_strcmp(getName, expectLocaleName) != 0 )
{ | |
1095 log_data_err("uldn_localeDisplayName for displayLocale %s and na
medLocale %s returns unexpected name or status %s\n", itemPtr->displayLocale, it
emPtr->namedLocale, myErrorName(status)); | |
1096 } | |
1097 | |
1098 uldn_close(uldn); | |
1099 } else { | |
1100 log_data_err("uldn_open fails for displayLocale %s, status=%s\n", it
emPtr->displayLocale, u_errorName(status)); | |
1101 } | |
1102 #endif | |
1103 (void)ulen; /* Suppress variable not used warning */ | |
1104 } | |
1105 } | |
1106 | |
1107 /*------------------------------ | |
1108 * TestISOFunctions | |
1109 */ | |
1110 | |
1111 #if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION | |
1112 /* test for uloc_getISOLanguages, uloc_getISOCountries */ | |
1113 static void TestISOFunctions() | |
1114 { | |
1115 const char* const* str=uloc_getISOLanguages(); | |
1116 const char* const* str1=uloc_getISOCountries(); | |
1117 const char* test; | |
1118 const char *key = NULL; | |
1119 int32_t count = 0, skipped = 0; | |
1120 int32_t expect; | |
1121 UResourceBundle *res; | |
1122 UResourceBundle *subRes; | |
1123 UErrorCode status = U_ZERO_ERROR; | |
1124 | |
1125 /* test getISOLanguages*/ | |
1126 /*str=uloc_getISOLanguages(); */ | |
1127 log_verbose("Testing ISO Languages: \n"); | |
1128 | |
1129 /* use structLocale - this data is no longer in root */ | |
1130 res = ures_openDirect(loadTestData(&status), "structLocale", &status); | |
1131 subRes = ures_getByKey(res, "Languages", NULL, &status); | |
1132 if (U_FAILURE(status)) { | |
1133 log_data_err("There is an error in structLocale's ures_getByKey(\"Langua
ges\"), status=%s\n", u_errorName(status)); | |
1134 return; | |
1135 } | |
1136 | |
1137 expect = ures_getSize(subRes); | |
1138 for(count = 0; *(str+count) != 0; count++) | |
1139 { | |
1140 key = NULL; | |
1141 test = *(str+count); | |
1142 status = U_ZERO_ERROR; | |
1143 | |
1144 do { | |
1145 /* Skip over language tags. This API only returns language codes. */ | |
1146 skipped += (key != NULL); | |
1147 ures_getNextString(subRes, NULL, &key, &status); | |
1148 } | |
1149 while (key != NULL && strchr(key, '_')); | |
1150 | |
1151 if(key == NULL) | |
1152 break; | |
1153 /* TODO: Consider removing sh, which is deprecated */ | |
1154 if(strcmp(key,"root") == 0 || strcmp(key,"Fallback") == 0 || strcmp(key,
"sh") == 0) { | |
1155 ures_getNextString(subRes, NULL, &key, &status); | |
1156 skipped++; | |
1157 } | |
1158 #if U_CHARSET_FAMILY==U_ASCII_FAMILY | |
1159 /* This code only works on ASCII machines where the keys are stored in A
SCII order */ | |
1160 if(strcmp(test,key)) { | |
1161 /* The first difference usually implies the place where things get o
ut of sync */ | |
1162 log_err("FAIL Language diff at offset %d, \"%s\" != \"%s\"\n", count
, test, key); | |
1163 } | |
1164 #endif | |
1165 | |
1166 if(!strcmp(test,"in")) | |
1167 log_err("FAIL getISOLanguages() has obsolete language code %s\n", te
st); | |
1168 if(!strcmp(test,"iw")) | |
1169 log_err("FAIL getISOLanguages() has obsolete language code %s\n", te
st); | |
1170 if(!strcmp(test,"ji")) | |
1171 log_err("FAIL getISOLanguages() has obsolete language code %s\n", te
st); | |
1172 if(!strcmp(test,"jw")) | |
1173 log_err("FAIL getISOLanguages() has obsolete language code %s\n", te
st); | |
1174 if(!strcmp(test,"sh")) | |
1175 log_err("FAIL getISOLanguages() has obsolete language code %s\n", te
st); | |
1176 } | |
1177 | |
1178 expect -= skipped; /* Ignore the skipped resources from structLocale */ | |
1179 | |
1180 if(count!=expect) { | |
1181 log_err("There is an error in getISOLanguages, got %d, expected %d (as p
er structLocale)\n", count, expect); | |
1182 } | |
1183 | |
1184 subRes = ures_getByKey(res, "Countries", subRes, &status); | |
1185 log_verbose("Testing ISO Countries"); | |
1186 skipped = 0; | |
1187 expect = ures_getSize(subRes) - 1; /* Skip ZZ */ | |
1188 for(count = 0; *(str1+count) != 0; count++) | |
1189 { | |
1190 key = NULL; | |
1191 test = *(str1+count); | |
1192 do { | |
1193 /* Skip over numeric UN tags. This API only returns ISO-3166 codes.
*/ | |
1194 skipped += (key != NULL); | |
1195 ures_getNextString(subRes, NULL, &key, &status); | |
1196 } | |
1197 while (key != NULL && strlen(key) != 2); | |
1198 | |
1199 if(key == NULL) | |
1200 break; | |
1201 /* TODO: Consider removing CS, which is deprecated */ | |
1202 while(strcmp(key,"QO") == 0 || strcmp(key,"QU") == 0 || strcmp(key,"CS")
== 0) { | |
1203 ures_getNextString(subRes, NULL, &key, &status); | |
1204 skipped++; | |
1205 } | |
1206 #if U_CHARSET_FAMILY==U_ASCII_FAMILY | |
1207 /* This code only works on ASCII machines where the keys are stored in A
SCII order */ | |
1208 if(strcmp(test,key)) { | |
1209 /* The first difference usually implies the place where things get o
ut of sync */ | |
1210 log_err("FAIL Country diff at offset %d, \"%s\" != \"%s\"\n", count,
test, key); | |
1211 } | |
1212 #endif | |
1213 if(!strcmp(test,"FX")) | |
1214 log_err("FAIL getISOCountries() has obsolete country code %s\n", tes
t); | |
1215 if(!strcmp(test,"YU")) | |
1216 log_err("FAIL getISOCountries() has obsolete country code %s\n", tes
t); | |
1217 if(!strcmp(test,"ZR")) | |
1218 log_err("FAIL getISOCountries() has obsolete country code %s\n", tes
t); | |
1219 } | |
1220 | |
1221 ures_getNextString(subRes, NULL, &key, &status); | |
1222 if (strcmp(key, "ZZ") != 0) { | |
1223 log_err("ZZ was expected to be the last entry in structLocale, but got %
s\n", key); | |
1224 } | |
1225 #if U_CHARSET_FAMILY==U_EBCDIC_FAMILY | |
1226 /* On EBCDIC machines, the numbers are sorted last. Account for those in the
skipped value too. */ | |
1227 key = NULL; | |
1228 do { | |
1229 /* Skip over numeric UN tags. uloc_getISOCountries only returns ISO-3166
codes. */ | |
1230 skipped += (key != NULL); | |
1231 ures_getNextString(subRes, NULL, &key, &status); | |
1232 } | |
1233 while (U_SUCCESS(status) && key != NULL && strlen(key) != 2); | |
1234 #endif | |
1235 expect -= skipped; /* Ignore the skipped resources from structLocale */ | |
1236 if(count!=expect) | |
1237 { | |
1238 log_err("There is an error in getISOCountries, got %d, expected %d \n",
count, expect); | |
1239 } | |
1240 ures_close(subRes); | |
1241 ures_close(res); | |
1242 } | |
1243 #endif | |
1244 | |
1245 static void setUpDataTable() | |
1246 { | |
1247 int32_t i,j; | |
1248 dataTable = (UChar***)(calloc(sizeof(UChar**),LOCALE_INFO_SIZE)); | |
1249 | |
1250 for (i = 0; i < LOCALE_INFO_SIZE; i++) { | |
1251 dataTable[i] = (UChar**)(calloc(sizeof(UChar*),LOCALE_SIZE)); | |
1252 for (j = 0; j < LOCALE_SIZE; j++){ | |
1253 dataTable[i][j] = CharsToUChars(rawData2[i][j]); | |
1254 } | |
1255 } | |
1256 } | |
1257 | |
1258 static void cleanUpDataTable() | |
1259 { | |
1260 int32_t i,j; | |
1261 if(dataTable != NULL) { | |
1262 for (i=0; i<LOCALE_INFO_SIZE; i++) { | |
1263 for(j = 0; j < LOCALE_SIZE; j++) { | |
1264 free(dataTable[i][j]); | |
1265 } | |
1266 free(dataTable[i]); | |
1267 } | |
1268 free(dataTable); | |
1269 } | |
1270 dataTable = NULL; | |
1271 } | |
1272 | |
1273 /** | |
1274 * @bug 4011756 4011380 | |
1275 */ | |
1276 static void TestISO3Fallback() | |
1277 { | |
1278 const char* test="xx_YY"; | |
1279 | |
1280 const char * result; | |
1281 | |
1282 result = uloc_getISO3Language(test); | |
1283 | |
1284 /* Conform to C API usage */ | |
1285 | |
1286 if (!result || (result[0] != 0)) | |
1287 log_err("getISO3Language() on xx_YY returned %s instead of \"\""); | |
1288 | |
1289 result = uloc_getISO3Country(test); | |
1290 | |
1291 if (!result || (result[0] != 0)) | |
1292 log_err("getISO3Country() on xx_YY returned %s instead of \"\""); | |
1293 } | |
1294 | |
1295 /** | |
1296 * @bug 4118587 | |
1297 */ | |
1298 static void TestSimpleDisplayNames() | |
1299 { | |
1300 /* | |
1301 This test is different from TestDisplayNames because TestDisplayNames check
s | |
1302 fallback behavior, combination of language and country names to form locale | |
1303 names, and other stuff like that. This test just checks specific language | |
1304 and country codes to make sure we have the correct names for them. | |
1305 */ | |
1306 char languageCodes[] [4] = { "he", "id", "iu", "ug", "yi", "za", "419" }; | |
1307 const char* languageNames [] = { "Hebrew", "Indonesian", "Inuktitut", "Uyghu
r", "Yiddish", | |
1308 "Zhuang", "419" }; | |
1309 const char* inLocale [] = { "en_US", "zh_Hant"}; | |
1310 UErrorCode status=U_ZERO_ERROR; | |
1311 | |
1312 int32_t i; | |
1313 int32_t localeIndex = 0; | |
1314 for (i = 0; i < 7; i++) { | |
1315 UChar *testLang=0; | |
1316 UChar *expectedLang=0; | |
1317 int size=0; | |
1318 | |
1319 if (i == 6) { | |
1320 localeIndex = 1; /* Use the second locale for the rest of the test.
*/ | |
1321 } | |
1322 | |
1323 size=uloc_getDisplayLanguage(languageCodes[i], inLocale[localeIndex], NU
LL, size, &status); | |
1324 if(status==U_BUFFER_OVERFLOW_ERROR) { | |
1325 status=U_ZERO_ERROR; | |
1326 testLang=(UChar*)malloc(sizeof(UChar) * (size + 1)); | |
1327 uloc_getDisplayLanguage(languageCodes[i], inLocale[localeIndex], tes
tLang, size + 1, &status); | |
1328 } | |
1329 expectedLang=(UChar*)malloc(sizeof(UChar) * (strlen(languageNames[i])+1)
); | |
1330 u_uastrcpy(expectedLang, languageNames[i]); | |
1331 if (u_strcmp(testLang, expectedLang) != 0) | |
1332 log_data_err("Got wrong display name for %s : Expected \"%s\", got \
"%s\".\n", | |
1333 languageCodes[i], languageNames[i], austrdup(testLang)); | |
1334 free(testLang); | |
1335 free(expectedLang); | |
1336 } | |
1337 | |
1338 } | |
1339 | |
1340 /** | |
1341 * @bug 4118595 | |
1342 */ | |
1343 static void TestUninstalledISO3Names() | |
1344 { | |
1345 /* This test checks to make sure getISO3Language and getISO3Country work right | |
1346 even for locales that are not installed. */ | |
1347 static const char iso2Languages [][4] = { "am", "ba", "fy", "mr", "rn", | |
1348 "ss", "tw", "zu" }; | |
1349 static const char iso3Languages [][5] = { "amh", "bak", "fry", "mar", "r
un", | |
1350 "ssw", "twi", "zul" }; | |
1351 static const char iso2Countries [][6] = { "am_AF", "ba_BW", "fy_KZ", "mr
_MO", "rn_MN", | |
1352 "ss_SB", "tw_TC", "zu_ZW" }; | |
1353 static const char iso3Countries [][4] = { "AFG", "BWA", "KAZ", "MAC", "M
NG", | |
1354 "SLB", "TCA", "ZWE" }; | |
1355 int32_t i; | |
1356 | |
1357 for (i = 0; i < 8; i++) { | |
1358 UErrorCode err = U_ZERO_ERROR; | |
1359 const char *test; | |
1360 test = uloc_getISO3Language(iso2Languages[i]); | |
1361 if(strcmp(test, iso3Languages[i]) !=0 || U_FAILURE(err)) | |
1362 log_err("Got wrong ISO3 code for %s : Expected \"%s\", got \"%s\". %s\n
", | |
1363 iso2Languages[i], iso3Languages[i], test, myErrorName(err))
; | |
1364 } | |
1365 for (i = 0; i < 8; i++) { | |
1366 UErrorCode err = U_ZERO_ERROR; | |
1367 const char *test; | |
1368 test = uloc_getISO3Country(iso2Countries[i]); | |
1369 if(strcmp(test, iso3Countries[i]) !=0 || U_FAILURE(err)) | |
1370 log_err("Got wrong ISO3 code for %s : Expected \"%s\", got \"%s\". %s\n
", | |
1371 iso2Countries[i], iso3Countries[i], test, myErrorName(err))
; | |
1372 } | |
1373 } | |
1374 | |
1375 | |
1376 static void TestVariantParsing() | |
1377 { | |
1378 static const char* en_US_custom="en_US_De Anza_Cupertino_California_United S
tates_Earth"; | |
1379 static const char* dispName="English (United States, DE ANZA_CUPERTINO_CALIF
ORNIA_UNITED STATES_EARTH)"; | |
1380 static const char* dispVar="DE ANZA_CUPERTINO_CALIFORNIA_UNITED STATES_EARTH
"; | |
1381 static const char* shortVariant="fr_FR_foo"; | |
1382 static const char* bogusVariant="fr_FR__foo"; | |
1383 static const char* bogusVariant2="fr_FR_foo_"; | |
1384 static const char* bogusVariant3="fr_FR__foo_"; | |
1385 | |
1386 | |
1387 UChar displayVar[100]; | |
1388 UChar displayName[100]; | |
1389 UErrorCode status=U_ZERO_ERROR; | |
1390 UChar* got=0; | |
1391 int32_t size=0; | |
1392 size=uloc_getDisplayVariant(en_US_custom, "en_US", NULL, size, &status); | |
1393 if(status==U_BUFFER_OVERFLOW_ERROR) { | |
1394 status=U_ZERO_ERROR; | |
1395 got=(UChar*)realloc(got, sizeof(UChar) * (size+1)); | |
1396 uloc_getDisplayVariant(en_US_custom, "en_US", got, size + 1, &status); | |
1397 } | |
1398 else { | |
1399 log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n"); | |
1400 } | |
1401 u_uastrcpy(displayVar, dispVar); | |
1402 if(u_strcmp(got,displayVar)!=0) { | |
1403 log_err("FAIL: getDisplayVariant() Wanted %s, got %s\n", dispVar, austrd
up(got)); | |
1404 } | |
1405 size=0; | |
1406 size=uloc_getDisplayName(en_US_custom, "en_US", NULL, size, &status); | |
1407 if(status==U_BUFFER_OVERFLOW_ERROR) { | |
1408 status=U_ZERO_ERROR; | |
1409 got=(UChar*)realloc(got, sizeof(UChar) * (size+1)); | |
1410 uloc_getDisplayName(en_US_custom, "en_US", got, size + 1, &status); | |
1411 } | |
1412 else { | |
1413 log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n"); | |
1414 } | |
1415 u_uastrcpy(displayName, dispName); | |
1416 if(u_strcmp(got,displayName)!=0) { | |
1417 if (status == U_USING_DEFAULT_WARNING) { | |
1418 log_data_err("FAIL: getDisplayName() got %s. Perhaps you are missing
data?\n", u_errorName(status)); | |
1419 } else { | |
1420 log_err("FAIL: getDisplayName() Wanted %s, got %s\n", dispName, aust
rdup(got)); | |
1421 } | |
1422 } | |
1423 | |
1424 size=0; | |
1425 status=U_ZERO_ERROR; | |
1426 size=uloc_getDisplayVariant(shortVariant, NULL, NULL, size, &status); | |
1427 if(status==U_BUFFER_OVERFLOW_ERROR) { | |
1428 status=U_ZERO_ERROR; | |
1429 got=(UChar*)realloc(got, sizeof(UChar) * (size+1)); | |
1430 uloc_getDisplayVariant(shortVariant, NULL, got, size + 1, &status); | |
1431 } | |
1432 else { | |
1433 log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n"); | |
1434 } | |
1435 if(strcmp(austrdup(got),"FOO")!=0) { | |
1436 log_err("FAIL: getDisplayVariant() Wanted: foo Got: %s\n", austrdup(go
t)); | |
1437 } | |
1438 size=0; | |
1439 status=U_ZERO_ERROR; | |
1440 size=uloc_getDisplayVariant(bogusVariant, NULL, NULL, size, &status); | |
1441 if(status==U_BUFFER_OVERFLOW_ERROR) { | |
1442 status=U_ZERO_ERROR; | |
1443 got=(UChar*)realloc(got, sizeof(UChar) * (size+1)); | |
1444 uloc_getDisplayVariant(bogusVariant, NULL, got, size + 1, &status); | |
1445 } | |
1446 else { | |
1447 log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n"); | |
1448 } | |
1449 if(strcmp(austrdup(got),"_FOO")!=0) { | |
1450 log_err("FAIL: getDisplayVariant() Wanted: _FOO Got: %s\n", austrdup(g
ot)); | |
1451 } | |
1452 size=0; | |
1453 status=U_ZERO_ERROR; | |
1454 size=uloc_getDisplayVariant(bogusVariant2, NULL, NULL, size, &status); | |
1455 if(status==U_BUFFER_OVERFLOW_ERROR) { | |
1456 status=U_ZERO_ERROR; | |
1457 got=(UChar*)realloc(got, sizeof(UChar) * (size+1)); | |
1458 uloc_getDisplayVariant(bogusVariant2, NULL, got, size + 1, &status); | |
1459 } | |
1460 else { | |
1461 log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n"); | |
1462 } | |
1463 if(strcmp(austrdup(got),"FOO_")!=0) { | |
1464 log_err("FAIL: getDisplayVariant() Wanted: FOO_ Got: %s\n", austrdup(g
ot)); | |
1465 } | |
1466 size=0; | |
1467 status=U_ZERO_ERROR; | |
1468 size=uloc_getDisplayVariant(bogusVariant3, NULL, NULL, size, &status); | |
1469 if(status==U_BUFFER_OVERFLOW_ERROR) { | |
1470 status=U_ZERO_ERROR; | |
1471 got=(UChar*)realloc(got, sizeof(UChar) * (size+1)); | |
1472 uloc_getDisplayVariant(bogusVariant3, NULL, got, size + 1, &status); | |
1473 } | |
1474 else { | |
1475 log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n"); | |
1476 } | |
1477 if(strcmp(austrdup(got),"_FOO_")!=0) { | |
1478 log_err("FAIL: getDisplayVariant() Wanted: _FOO_ Got: %s\n", austrdup(
got)); | |
1479 } | |
1480 free(got); | |
1481 } | |
1482 | |
1483 | |
1484 static void TestObsoleteNames(void) | |
1485 { | |
1486 int32_t i; | |
1487 UErrorCode status = U_ZERO_ERROR; | |
1488 char buff[256]; | |
1489 | |
1490 static const struct | |
1491 { | |
1492 char locale[9]; | |
1493 char lang3[4]; | |
1494 char lang[4]; | |
1495 char ctry3[4]; | |
1496 char ctry[4]; | |
1497 } tests[] = | |
1498 { | |
1499 { "eng_USA", "eng", "en", "USA", "US" }, | |
1500 { "kok", "kok", "kok", "", "" }, | |
1501 { "in", "ind", "in", "", "" }, | |
1502 { "id", "ind", "id", "", "" }, /* NO aliasing */ | |
1503 { "sh", "srp", "sh", "", "" }, | |
1504 { "zz_CS", "", "zz", "SCG", "CS" }, | |
1505 { "zz_FX", "", "zz", "FXX", "FX" }, | |
1506 { "zz_RO", "", "zz", "ROU", "RO" }, | |
1507 { "zz_TP", "", "zz", "TMP", "TP" }, | |
1508 { "zz_TL", "", "zz", "TLS", "TL" }, | |
1509 { "zz_ZR", "", "zz", "ZAR", "ZR" }, | |
1510 { "zz_FXX", "", "zz", "FXX", "FX" }, /* no aliasing. Doesn't go to PS(P
SE). */ | |
1511 { "zz_ROM", "", "zz", "ROU", "RO" }, | |
1512 { "zz_ROU", "", "zz", "ROU", "RO" }, | |
1513 { "zz_ZAR", "", "zz", "ZAR", "ZR" }, | |
1514 { "zz_TMP", "", "zz", "TMP", "TP" }, | |
1515 { "zz_TLS", "", "zz", "TLS", "TL" }, | |
1516 { "zz_YUG", "", "zz", "YUG", "YU" }, | |
1517 { "mlt_PSE", "mlt", "mt", "PSE", "PS" }, | |
1518 { "iw", "heb", "iw", "", "" }, | |
1519 { "ji", "yid", "ji", "", "" }, | |
1520 { "jw", "jaw", "jw", "", "" }, | |
1521 { "sh", "srp", "sh", "", "" }, | |
1522 { "", "", "", "", "" } | |
1523 }; | |
1524 | |
1525 for(i=0;tests[i].locale[0];i++) | |
1526 { | |
1527 const char *locale; | |
1528 | |
1529 locale = tests[i].locale; | |
1530 log_verbose("** %s:\n", locale); | |
1531 | |
1532 status = U_ZERO_ERROR; | |
1533 if(strcmp(tests[i].lang3,uloc_getISO3Language(locale))) | |
1534 { | |
1535 log_err("FAIL: uloc_getISO3Language(%s)==\t\"%s\",\t expected \"%s\"
\n", | |
1536 locale, uloc_getISO3Language(locale), tests[i].lang3); | |
1537 } | |
1538 else | |
1539 { | |
1540 log_verbose(" uloc_getISO3Language()==\t\"%s\"\n", | |
1541 uloc_getISO3Language(locale) ); | |
1542 } | |
1543 | |
1544 status = U_ZERO_ERROR; | |
1545 uloc_getLanguage(locale, buff, 256, &status); | |
1546 if(U_FAILURE(status)) | |
1547 { | |
1548 log_err("FAIL: error getting language from %s\n", locale); | |
1549 } | |
1550 else | |
1551 { | |
1552 if(strcmp(buff,tests[i].lang)) | |
1553 { | |
1554 log_err("FAIL: uloc_getLanguage(%s)==\t\"%s\"\t expected \"%s\"\
n", | |
1555 locale, buff, tests[i].lang); | |
1556 } | |
1557 else | |
1558 { | |
1559 log_verbose(" uloc_getLanguage(%s)==\t%s\n", locale, buff); | |
1560 } | |
1561 } | |
1562 if(strcmp(tests[i].lang3,uloc_getISO3Language(locale))) | |
1563 { | |
1564 log_err("FAIL: uloc_getISO3Language(%s)==\t\"%s\",\t expected \"%s\"
\n", | |
1565 locale, uloc_getISO3Language(locale), tests[i].lang3); | |
1566 } | |
1567 else | |
1568 { | |
1569 log_verbose(" uloc_getISO3Language()==\t\"%s\"\n", | |
1570 uloc_getISO3Language(locale) ); | |
1571 } | |
1572 | |
1573 if(strcmp(tests[i].ctry3,uloc_getISO3Country(locale))) | |
1574 { | |
1575 log_err("FAIL: uloc_getISO3Country(%s)==\t\"%s\",\t expected \"%s\"\
n", | |
1576 locale, uloc_getISO3Country(locale), tests[i].ctry3); | |
1577 } | |
1578 else | |
1579 { | |
1580 log_verbose(" uloc_getISO3Country()==\t\"%s\"\n", | |
1581 uloc_getISO3Country(locale) ); | |
1582 } | |
1583 | |
1584 status = U_ZERO_ERROR; | |
1585 uloc_getCountry(locale, buff, 256, &status); | |
1586 if(U_FAILURE(status)) | |
1587 { | |
1588 log_err("FAIL: error getting country from %s\n", locale); | |
1589 } | |
1590 else | |
1591 { | |
1592 if(strcmp(buff,tests[i].ctry)) | |
1593 { | |
1594 log_err("FAIL: uloc_getCountry(%s)==\t\"%s\"\t expected \"%s\"\n
", | |
1595 locale, buff, tests[i].ctry); | |
1596 } | |
1597 else | |
1598 { | |
1599 log_verbose(" uloc_getCountry(%s)==\t%s\n", locale, buff); | |
1600 } | |
1601 } | |
1602 } | |
1603 | |
1604 if (uloc_getLCID("iw_IL") != uloc_getLCID("he_IL")) { | |
1605 log_err("he,iw LCID mismatch: %X versus %X\n", uloc_getLCID("iw_IL"), ul
oc_getLCID("he_IL")); | |
1606 } | |
1607 | |
1608 if (uloc_getLCID("iw") != uloc_getLCID("he")) { | |
1609 log_err("he,iw LCID mismatch: %X versus %X\n", uloc_getLCID("iw"), uloc_
getLCID("he")); | |
1610 } | |
1611 | |
1612 #if 0 | |
1613 | |
1614 i = uloc_getLanguage("kok",NULL,0,&icu_err); | |
1615 if(U_FAILURE(icu_err)) | |
1616 { | |
1617 log_err("FAIL: Got %s trying to do uloc_getLanguage(kok)\n", u_errorName
(icu_err)); | |
1618 } | |
1619 | |
1620 icu_err = U_ZERO_ERROR; | |
1621 uloc_getLanguage("kok",r1_buff,12,&icu_err); | |
1622 if(U_FAILURE(icu_err)) | |
1623 { | |
1624 log_err("FAIL: Got %s trying to do uloc_getLanguage(kok, buff)\n", u_err
orName(icu_err)); | |
1625 } | |
1626 | |
1627 r1_addr = (char *)uloc_getISO3Language("kok"); | |
1628 | |
1629 icu_err = U_ZERO_ERROR; | |
1630 if (strcmp(r1_buff,"kok") != 0) | |
1631 { | |
1632 log_err("FAIL: uloc_getLanguage(kok)==%s not kok\n",r1_buff); | |
1633 line--; | |
1634 } | |
1635 r1_addr = (char *)uloc_getISO3Language("in"); | |
1636 i = uloc_getLanguage(r1_addr,r1_buff,12,&icu_err); | |
1637 if (strcmp(r1_buff,"id") != 0) | |
1638 { | |
1639 printf("uloc_getLanguage error (%s)\n",r1_buff); | |
1640 line--; | |
1641 } | |
1642 r1_addr = (char *)uloc_getISO3Language("sh"); | |
1643 i = uloc_getLanguage(r1_addr,r1_buff,12,&icu_err); | |
1644 if (strcmp(r1_buff,"sr") != 0) | |
1645 { | |
1646 printf("uloc_getLanguage error (%s)\n",r1_buff); | |
1647 line--; | |
1648 } | |
1649 | |
1650 r1_addr = (char *)uloc_getISO3Country("zz_ZR"); | |
1651 strcpy(p1_buff,"zz_"); | |
1652 strcat(p1_buff,r1_addr); | |
1653 i = uloc_getCountry(p1_buff,r1_buff,12,&icu_err); | |
1654 if (strcmp(r1_buff,"ZR") != 0) | |
1655 { | |
1656 printf("uloc_getCountry error (%s)\n",r1_buff); | |
1657 line--; | |
1658 } | |
1659 r1_addr = (char *)uloc_getISO3Country("zz_FX"); | |
1660 strcpy(p1_buff,"zz_"); | |
1661 strcat(p1_buff,r1_addr); | |
1662 i = uloc_getCountry(p1_buff,r1_buff,12,&icu_err); | |
1663 if (strcmp(r1_buff,"FX") != 0) | |
1664 { | |
1665 printf("uloc_getCountry error (%s)\n",r1_buff); | |
1666 line--; | |
1667 } | |
1668 | |
1669 #endif | |
1670 | |
1671 } | |
1672 | |
1673 static void TestKeywordVariants(void) | |
1674 { | |
1675 static const struct { | |
1676 const char *localeID; | |
1677 const char *expectedLocaleID; /* uloc_getName */ | |
1678 const char *expectedLocaleIDNoKeywords; /* uloc_getBaseName */ | |
1679 const char *expectedCanonicalID; /* uloc_canonicalize */ | |
1680 const char *expectedKeywords[10]; | |
1681 int32_t numKeywords; | |
1682 UErrorCode expectedStatus; /* from uloc_openKeywords */ | |
1683 } testCases[] = { | |
1684 { | |
1685 "de_DE@ currency = euro; C o ll A t i o n = Phonebook ; C alen
dar = buddhist ", | |
1686 "de_DE@calendar=buddhist;collation=Phonebook;currency=euro", | |
1687 "de_DE", | |
1688 "de_DE@calendar=buddhist;collation=Phonebook;currency=euro", | |
1689 {"calendar", "collation", "currency"}, | |
1690 3, | |
1691 U_ZERO_ERROR | |
1692 }, | |
1693 { | |
1694 "de_DE@euro", | |
1695 "de_DE@euro", | |
1696 "de_DE@euro", /* we probably should strip off the POSIX style vari
ant @euro see #11690 */ | |
1697 "de_DE@currency=EUR", | |
1698 {"","","","","","",""}, | |
1699 0, | |
1700 U_INVALID_FORMAT_ERROR /* must have '=' after '@' */ | |
1701 }, | |
1702 { | |
1703 "de_DE@euro;collation=phonebook", /* The POSIX style variant @euro
cannot be combined with key=value? */ | |
1704 "de_DE", /* getName returns de_DE - should be INVALID_FORMAT_ERROR?
*/ | |
1705 "de_DE", /* getBaseName returns de_DE - should be INVALID_FORMAT_ERR
OR? see #11690 */ | |
1706 "de_DE", /* canonicalize returns de_DE - should be INVALID_FORMAT_ER
ROR? */ | |
1707 {"","","","","","",""}, | |
1708 0, | |
1709 U_INVALID_FORMAT_ERROR | |
1710 }, | |
1711 { | |
1712 "de_DE@collation=", | |
1713 0, /* expected getName to fail */ | |
1714 "de_DE", /* getBaseName returns de_DE - should be INVALID_FORMAT_ERR
OR? see #11690 */ | |
1715 0, /* expected canonicalize to fail */ | |
1716 {"","","","","","",""}, | |
1717 0, | |
1718 U_INVALID_FORMAT_ERROR /* must have '=' after '@' */ | |
1719 } | |
1720 }; | |
1721 UErrorCode status = U_ZERO_ERROR; | |
1722 | |
1723 int32_t i = 0, j = 0; | |
1724 int32_t resultLen = 0; | |
1725 char buffer[256]; | |
1726 UEnumeration *keywords; | |
1727 int32_t keyCount = 0; | |
1728 const char *keyword = NULL; | |
1729 int32_t keywordLen = 0; | |
1730 | |
1731 for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { | |
1732 status = U_ZERO_ERROR; | |
1733 *buffer = 0; | |
1734 keywords = uloc_openKeywords(testCases[i].localeID, &status); | |
1735 | |
1736 if(status != testCases[i].expectedStatus) { | |
1737 log_err("Expected to uloc_openKeywords(\"%s\") => status %s. Got %s
instead\n", | |
1738 testCases[i].localeID, | |
1739 u_errorName(testCases[i].expectedStatus), u_errorName(status
)); | |
1740 } | |
1741 status = U_ZERO_ERROR; | |
1742 if(keywords) { | |
1743 if((keyCount = uenum_count(keywords, &status)) != testCases[i].numKe
ywords) { | |
1744 log_err("Expected to get %i keywords, got %i\n", testCases[i].nu
mKeywords, keyCount); | |
1745 } | |
1746 if(keyCount) { | |
1747 j = 0; | |
1748 while((keyword = uenum_next(keywords, &keywordLen, &status))) { | |
1749 if(strcmp(keyword, testCases[i].expectedKeywords[j]) != 0) { | |
1750 log_err("Expected to get keyword value %s, got %s\n", te
stCases[i].expectedKeywords[j], keyword); | |
1751 } | |
1752 j++; | |
1753 } | |
1754 j = 0; | |
1755 uenum_reset(keywords, &status); | |
1756 while((keyword = uenum_next(keywords, &keywordLen, &status))) { | |
1757 if(strcmp(keyword, testCases[i].expectedKeywords[j]) != 0) { | |
1758 log_err("Expected to get keyword value %s, got %s\n", te
stCases[i].expectedKeywords[j], keyword); | |
1759 } | |
1760 j++; | |
1761 } | |
1762 } | |
1763 uenum_close(keywords); | |
1764 } | |
1765 | |
1766 status = U_ZERO_ERROR; | |
1767 resultLen = uloc_getName(testCases[i].localeID, buffer, 256, &status); | |
1768 if (U_SUCCESS(status)) { | |
1769 if (testCases[i].expectedLocaleID == 0) { | |
1770 log_err("Expected uloc_getName(\"%s\") to fail; got \"%s\"\n", | |
1771 testCases[i].localeID, buffer); | |
1772 } else if (uprv_strcmp(testCases[i].expectedLocaleID, buffer) != 0)
{ | |
1773 log_err("Expected uloc_getName(\"%s\") => \"%s\"; got \"%s\"\n", | |
1774 testCases[i].localeID, testCases[i].expectedLocaleID, bu
ffer); | |
1775 } | |
1776 } else { | |
1777 if (testCases[i].expectedLocaleID != 0) { | |
1778 log_err("Expected uloc_getName(\"%s\") => \"%s\"; but returned e
rror: %s\n", | |
1779 testCases[i].localeID, testCases[i].expectedLocaleID, bu
ffer, u_errorName(status)); | |
1780 } | |
1781 } | |
1782 | |
1783 status = U_ZERO_ERROR; | |
1784 resultLen = uloc_getBaseName(testCases[i].localeID, buffer, 256, &status
); | |
1785 if (U_SUCCESS(status)) { | |
1786 if (testCases[i].expectedLocaleIDNoKeywords == 0) { | |
1787 log_err("Expected uloc_getBaseName(\"%s\") to fail; got \"%s\"\n
", | |
1788 testCases[i].localeID, buffer); | |
1789 } else if (uprv_strcmp(testCases[i].expectedLocaleIDNoKeywords, buff
er) != 0) { | |
1790 log_err("Expected uloc_getBaseName(\"%s\") => \"%s\"; got \"%s\"
\n", | |
1791 testCases[i].localeID, testCases[i].expectedLocaleIDNoKe
ywords, buffer); | |
1792 } | |
1793 } else { | |
1794 if (testCases[i].expectedLocaleIDNoKeywords != 0) { | |
1795 log_err("Expected uloc_getBaseName(\"%s\") => \"%s\"; but return
ed error: %s\n", | |
1796 testCases[i].localeID, testCases[i].expectedLocaleIDNoKe
ywords, buffer, u_errorName(status)); | |
1797 } | |
1798 } | |
1799 | |
1800 status = U_ZERO_ERROR; | |
1801 resultLen = uloc_canonicalize(testCases[i].localeID, buffer, 256, &statu
s); | |
1802 if (U_SUCCESS(status)) { | |
1803 if (testCases[i].expectedCanonicalID == 0) { | |
1804 log_err("Expected uloc_canonicalize(\"%s\") to fail; got \"%s\"\
n", | |
1805 testCases[i].localeID, buffer); | |
1806 } else if (uprv_strcmp(testCases[i].expectedCanonicalID, buffer) !=
0) { | |
1807 log_err("Expected uloc_canonicalize(\"%s\") => \"%s\"; got \"%s\
"\n", | |
1808 testCases[i].localeID, testCases[i].expectedCanonicalID,
buffer); | |
1809 } | |
1810 } else { | |
1811 if (testCases[i].expectedCanonicalID != 0) { | |
1812 log_err("Expected uloc_canonicalize(\"%s\") => \"%s\"; but retur
ned error: %s\n", | |
1813 testCases[i].localeID, testCases[i].expectedCanonicalID,
buffer, u_errorName(status)); | |
1814 } | |
1815 } | |
1816 } | |
1817 } | |
1818 | |
1819 static void TestKeywordVariantParsing(void) | |
1820 { | |
1821 static const struct { | |
1822 const char *localeID; | |
1823 const char *keyword; | |
1824 const char *expectedValue; | |
1825 } testCases[] = { | |
1826 { "de_DE@ C o ll A t i o n = Phonebook ", "c o ll a t i o n", "Phon
ebook" }, | |
1827 { "de_DE", "collation", ""}, | |
1828 { "de_DE@collation=PHONEBOOK", "collation", "PHONEBOOK" }, | |
1829 { "de_DE@currency = euro; CoLLaTion = PHONEBOOk", "collatiON", "PHONEB
OOk" }, | |
1830 }; | |
1831 | |
1832 UErrorCode status = U_ZERO_ERROR; | |
1833 | |
1834 int32_t i = 0; | |
1835 int32_t resultLen = 0; | |
1836 char buffer[256]; | |
1837 | |
1838 for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { | |
1839 *buffer = 0; | |
1840 resultLen = uloc_getKeywordValue(testCases[i].localeID, testCases[i].key
word, buffer, 256, &status); | |
1841 (void)resultLen; /* Suppress set but not used warning. */ | |
1842 if(uprv_strcmp(testCases[i].expectedValue, buffer) != 0) { | |
1843 log_err("Expected to extract \"%s\" from \"%s\" for keyword \"%s\".
Got \"%s\" instead\n", | |
1844 testCases[i].expectedValue, testCases[i].localeID, testCases[i].
keyword, buffer); | |
1845 } | |
1846 } | |
1847 } | |
1848 | |
1849 static const struct { | |
1850 const char *l; /* locale */ | |
1851 const char *k; /* kw */ | |
1852 const char *v; /* value */ | |
1853 const char *x; /* expected */ | |
1854 } kwSetTestCases[] = { | |
1855 #if 1 | |
1856 { "en_US", "calendar", "japanese", "en_US@calendar=japanese" }, | |
1857 { "en_US@", "calendar", "japanese", "en_US@calendar=japanese" }, | |
1858 { "en_US@calendar=islamic", "calendar", "japanese", "en_US@calendar=japanese"
}, | |
1859 { "en_US@calendar=slovakian", "calendar", "gregorian", "en_US@calendar=gregori
an" }, /* don't know what this means, but it has the same # of chars as gregoria
n */ | |
1860 { "en_US@calendar=gregorian", "calendar", "japanese", "en_US@calendar=japanese
" }, | |
1861 { "de", "Currency", "CHF", "de@currency=CHF" }, | |
1862 { "de", "Currency", "CHF", "de@currency=CHF" }, | |
1863 | |
1864 { "en_US@collation=phonebook", "calendar", "japanese", "en_US@calendar=japanes
e;collation=phonebook" }, | |
1865 { "en_US@calendar=japanese", "collation", "phonebook", "en_US@calendar=japanes
e;collation=phonebook" }, | |
1866 { "de@collation=phonebook", "Currency", "CHF", "de@collation=phonebook;currenc
y=CHF" }, | |
1867 { "en_US@calendar=gregorian;collation=phonebook", "calendar", "japanese", "en_
US@calendar=japanese;collation=phonebook" }, | |
1868 { "en_US@calendar=slovakian;collation=phonebook", "calendar", "gregorian", "en
_US@calendar=gregorian;collation=phonebook" }, /* don't know what this means, bu
t it has the same # of chars as gregorian */ | |
1869 { "en_US@calendar=slovakian;collation=videobook", "collation", "phonebook", "e
n_US@calendar=slovakian;collation=phonebook" }, /* don't know what this means, b
ut it has the same # of chars as gregorian */ | |
1870 { "en_US@calendar=islamic;collation=phonebook", "calendar", "japanese", "en_US
@calendar=japanese;collation=phonebook" }, | |
1871 { "de@collation=phonebook", "Currency", "CHF", "de@collation=phonebook;currenc
y=CHF" }, | |
1872 #endif | |
1873 #if 1 | |
1874 { "mt@a=0;b=1;c=2;d=3", "c","j", "mt@a=0;b=1;c=j;d=3" }, | |
1875 { "mt@a=0;b=1;c=2;d=3", "x","j", "mt@a=0;b=1;c=2;d=3;x=j" }, | |
1876 { "mt@a=0;b=1;c=2;d=3", "a","f", "mt@a=f;b=1;c=2;d=3" }, | |
1877 { "mt@a=0;aa=1;aaa=3", "a","x", "mt@a=x;aa=1;aaa=3" }, | |
1878 { "mt@a=0;aa=1;aaa=3", "aa","x", "mt@a=0;aa=x;aaa=3" }, | |
1879 { "mt@a=0;aa=1;aaa=3", "aaa","x", "mt@a=0;aa=1;aaa=x" }, | |
1880 { "mt@a=0;aa=1;aaa=3", "a","yy", "mt@a=yy;aa=1;aaa=3" }, | |
1881 { "mt@a=0;aa=1;aaa=3", "aa","yy", "mt@a=0;aa=yy;aaa=3" }, | |
1882 { "mt@a=0;aa=1;aaa=3", "aaa","yy", "mt@a=0;aa=1;aaa=yy" }, | |
1883 #endif | |
1884 #if 1 | |
1885 /* removal tests */ | |
1886 /* 1. removal of item at end */ | |
1887 { "de@collation=phonebook;currency=CHF", "currency", "", "de@collation=phone
book" }, | |
1888 { "de@collation=phonebook;currency=CHF", "currency", NULL, "de@collation=phone
book" }, | |
1889 /* 2. removal of item at beginning */ | |
1890 { "de@collation=phonebook;currency=CHF", "collation", "", "de@currency=CHF" }, | |
1891 { "de@collation=phonebook;currency=CHF", "collation", NULL, "de@currency=CHF"
}, | |
1892 /* 3. removal of an item not there */ | |
1893 { "de@collation=phonebook;currency=CHF", "calendar", NULL, "de@collation=phone
book;currency=CHF" }, | |
1894 /* 4. removal of only item */ | |
1895 { "de@collation=phonebook", "collation", NULL, "de" }, | |
1896 #endif | |
1897 { "de@collation=phonebook", "Currency", "CHF", "de@collation=phonebook;currenc
y=CHF" } | |
1898 }; | |
1899 | |
1900 | |
1901 static void TestKeywordSet(void) | |
1902 { | |
1903 int32_t i = 0; | |
1904 int32_t resultLen = 0; | |
1905 char buffer[1024]; | |
1906 | |
1907 char cbuffer[1024]; | |
1908 | |
1909 for(i = 0; i < sizeof(kwSetTestCases)/sizeof(kwSetTestCases[0]); i++) { | |
1910 UErrorCode status = U_ZERO_ERROR; | |
1911 memset(buffer,'%',1023); | |
1912 strcpy(buffer, kwSetTestCases[i].l); | |
1913 | |
1914 uloc_canonicalize(kwSetTestCases[i].l, cbuffer, 1023, &status); | |
1915 if(strcmp(buffer,cbuffer)) { | |
1916 log_verbose("note: [%d] wasn't canonical, should be: '%s' not '%s'. Wo
n't check for canonicity in output.\n", i, cbuffer, buffer); | |
1917 } | |
1918 /* sanity check test case results for canonicity */ | |
1919 uloc_canonicalize(kwSetTestCases[i].x, cbuffer, 1023, &status); | |
1920 if(strcmp(kwSetTestCases[i].x,cbuffer)) { | |
1921 log_err("%s:%d: ERROR: kwSetTestCases[%d].x = '%s', should be %s (must
be canonical)\n", __FILE__, __LINE__, i, kwSetTestCases[i].x, cbuffer); | |
1922 } | |
1923 | |
1924 resultLen = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].
v, buffer, 1023, &status); | |
1925 if(U_FAILURE(status)) { | |
1926 log_err("Err on test case %d: got error %s\n", i, u_errorName(status))
; | |
1927 continue; | |
1928 } | |
1929 if(strcmp(buffer,kwSetTestCases[i].x) || ((int32_t)strlen(buffer)!=resul
tLen)) { | |
1930 log_err("FAIL: #%d: %s + [%s=%s] -> %s (%d) expected %s (%d)\n", i, kw
SetTestCases[i].l, kwSetTestCases[i].k, | |
1931 kwSetTestCases[i].v, buffer, resultLen, kwSetTestCases[i].x, s
trlen(buffer)); | |
1932 } else { | |
1933 log_verbose("pass: #%d: %s + [%s=%s] -> %s\n", i, kwSetTestCases[i].l,
kwSetTestCases[i].k, kwSetTestCases[i].v,buffer); | |
1934 } | |
1935 } | |
1936 } | |
1937 | |
1938 static void TestKeywordSetError(void) | |
1939 { | |
1940 char buffer[1024]; | |
1941 UErrorCode status; | |
1942 int32_t res; | |
1943 int32_t i; | |
1944 int32_t blen; | |
1945 | |
1946 /* 0-test whether an error condition modifies the buffer at all */ | |
1947 blen=0; | |
1948 i=0; | |
1949 memset(buffer,'%',1023); | |
1950 status = U_ZERO_ERROR; | |
1951 res = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buffer,
blen, &status); | |
1952 if(status != U_ILLEGAL_ARGUMENT_ERROR) { | |
1953 log_err("expected illegal err got %s\n", u_errorName(status)); | |
1954 return; | |
1955 } | |
1956 /* if(res!=strlen(kwSetTestCases[i].x)) { | |
1957 log_err("expected result %d got %d\n", strlen(kwSetTestCases[i].x), res); | |
1958 return; | |
1959 } */ | |
1960 if(buffer[blen]!='%') { | |
1961 log_err("Buffer byte %d was modified: now %c\n", blen, buffer[blen]); | |
1962 return; | |
1963 } | |
1964 log_verbose("0-buffer modify OK\n"); | |
1965 | |
1966 for(i=0;i<=2;i++) { | |
1967 /* 1- test a short buffer with growing text */ | |
1968 blen=(int32_t)strlen(kwSetTestCases[i].l)+1; | |
1969 memset(buffer,'%',1023); | |
1970 strcpy(buffer,kwSetTestCases[i].l); | |
1971 status = U_ZERO_ERROR; | |
1972 res = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buf
fer, blen, &status); | |
1973 if(status != U_BUFFER_OVERFLOW_ERROR) { | |
1974 log_err("expected buffer overflow on buffer %d got %s, len %d (%s +
[%s=%s])\n", blen, u_errorName(status), res, kwSetTestCases[i].l, kwSetTestCases
[i].k, kwSetTestCases[i].v); | |
1975 return; | |
1976 } | |
1977 if(res!=(int32_t)strlen(kwSetTestCases[i].x)) { | |
1978 log_err("expected result %d got %d\n", strlen(kwSetTestCases[i].x),
res); | |
1979 return; | |
1980 } | |
1981 if(buffer[blen]!='%') { | |
1982 log_err("Buffer byte %d was modified: now %c\n", blen, buffer[blen])
; | |
1983 return; | |
1984 } | |
1985 log_verbose("1/%d-buffer modify OK\n",i); | |
1986 } | |
1987 | |
1988 for(i=3;i<=4;i++) { | |
1989 /* 2- test a short buffer - text the same size or shrinking */ | |
1990 blen=(int32_t)strlen(kwSetTestCases[i].l)+1; | |
1991 memset(buffer,'%',1023); | |
1992 strcpy(buffer,kwSetTestCases[i].l); | |
1993 status = U_ZERO_ERROR; | |
1994 res = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buf
fer, blen, &status); | |
1995 if(status != U_ZERO_ERROR) { | |
1996 log_err("expected zero error got %s\n", u_errorName(status)); | |
1997 return; | |
1998 } | |
1999 if(buffer[blen+1]!='%') { | |
2000 log_err("Buffer byte %d was modified: now %c\n", blen+1, buffer[blen
+1]); | |
2001 return; | |
2002 } | |
2003 if(res!=(int32_t)strlen(kwSetTestCases[i].x)) { | |
2004 log_err("expected result %d got %d\n", strlen(kwSetTestCases[i].x),
res); | |
2005 return; | |
2006 } | |
2007 if(strcmp(buffer,kwSetTestCases[i].x) || ((int32_t)strlen(buffer)!=res))
{ | |
2008 log_err("FAIL: #%d: %s + [%s=%s] -> %s (%d) expected %s (%d)\n", i,
kwSetTestCases[i].l, kwSetTestCases[i].k, | |
2009 kwSetTestCases[i].v, buffer, res, kwSetTestCases[i].x, strlen(bu
ffer)); | |
2010 } else { | |
2011 log_verbose("pass: #%d: %s + [%s=%s] -> %s\n", i, kwSetTestCases[i].
l, kwSetTestCases[i].k, kwSetTestCases[i].v, | |
2012 buffer); | |
2013 } | |
2014 log_verbose("2/%d-buffer modify OK\n",i); | |
2015 } | |
2016 } | |
2017 | |
2018 static int32_t _canonicalize(int32_t selector, /* 0==getName, 1==canonicalize */ | |
2019 const char* localeID, | |
2020 char* result, | |
2021 int32_t resultCapacity, | |
2022 UErrorCode* ec) { | |
2023 /* YOU can change this to use function pointers if you like */ | |
2024 switch (selector) { | |
2025 case 0: | |
2026 return uloc_getName(localeID, result, resultCapacity, ec); | |
2027 case 1: | |
2028 return uloc_canonicalize(localeID, result, resultCapacity, ec); | |
2029 default: | |
2030 return -1; | |
2031 } | |
2032 } | |
2033 | |
2034 static void TestCanonicalization(void) | |
2035 { | |
2036 static const struct { | |
2037 const char *localeID; /* input */ | |
2038 const char *getNameID; /* expected getName() result */ | |
2039 const char *canonicalID; /* expected canonicalize() result */ | |
2040 } testCases[] = { | |
2041 { "ca_ES_PREEURO-with-extra-stuff-that really doesn't make any sense-unl
ess-you're trying to increase code coverage", | |
2042 "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNL
ESS_YOU'RE TRYING TO INCREASE CODE COVERAGE", | |
2043 "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNL
ESS_YOU'RE TRYING TO INCREASE CODE COVERAGE"}, | |
2044 { "ca_ES_PREEURO", "ca_ES_PREEURO", "ca_ES@currency=ESP" }, | |
2045 { "de_AT_PREEURO", "de_AT_PREEURO", "de_AT@currency=ATS" }, | |
2046 { "de_DE_PREEURO", "de_DE_PREEURO", "de_DE@currency=DEM" }, | |
2047 { "de_LU_PREEURO", "de_LU_PREEURO", "de_LU@currency=LUF" }, | |
2048 { "el_GR_PREEURO", "el_GR_PREEURO", "el_GR@currency=GRD" }, | |
2049 { "en_BE_PREEURO", "en_BE_PREEURO", "en_BE@currency=BEF" }, | |
2050 { "en_IE_PREEURO", "en_IE_PREEURO", "en_IE@currency=IEP" }, | |
2051 { "es_ES_PREEURO", "es_ES_PREEURO", "es_ES@currency=ESP" }, | |
2052 { "eu_ES_PREEURO", "eu_ES_PREEURO", "eu_ES@currency=ESP" }, | |
2053 { "fi_FI_PREEURO", "fi_FI_PREEURO", "fi_FI@currency=FIM" }, | |
2054 { "fr_BE_PREEURO", "fr_BE_PREEURO", "fr_BE@currency=BEF" }, | |
2055 { "fr_FR_PREEURO", "fr_FR_PREEURO", "fr_FR@currency=FRF" }, | |
2056 { "fr_LU_PREEURO", "fr_LU_PREEURO", "fr_LU@currency=LUF" }, | |
2057 { "ga_IE_PREEURO", "ga_IE_PREEURO", "ga_IE@currency=IEP" }, | |
2058 { "gl_ES_PREEURO", "gl_ES_PREEURO", "gl_ES@currency=ESP" }, | |
2059 { "it_IT_PREEURO", "it_IT_PREEURO", "it_IT@currency=ITL" }, | |
2060 { "nl_BE_PREEURO", "nl_BE_PREEURO", "nl_BE@currency=BEF" }, | |
2061 { "nl_NL_PREEURO", "nl_NL_PREEURO", "nl_NL@currency=NLG" }, | |
2062 { "pt_PT_PREEURO", "pt_PT_PREEURO", "pt_PT@currency=PTE" }, | |
2063 { "de__PHONEBOOK", "de__PHONEBOOK", "de@collation=phonebook" }, | |
2064 { "en_GB_EURO", "en_GB_EURO", "en_GB@currency=EUR" }, | |
2065 { "en_GB@EURO", "en_GB@EURO", "en_GB@currency=EUR" }, /* POSIX ID */ | |
2066 { "es__TRADITIONAL", "es__TRADITIONAL", "es@collation=traditional" }, | |
2067 { "hi__DIRECT", "hi__DIRECT", "hi@collation=direct" }, | |
2068 { "ja_JP_TRADITIONAL", "ja_JP_TRADITIONAL", "ja_JP@calendar=japanese" }, | |
2069 { "th_TH_TRADITIONAL", "th_TH_TRADITIONAL", "th_TH@calendar=buddhist" }, | |
2070 { "zh_TW_STROKE", "zh_TW_STROKE", "zh_TW@collation=stroke" }, | |
2071 { "zh__PINYIN", "zh__PINYIN", "zh@collation=pinyin" }, | |
2072 { "zh@collation=pinyin", "zh@collation=pinyin", "zh@collation=pinyin" }, | |
2073 { "zh_CN@collation=pinyin", "zh_CN@collation=pinyin", "zh_CN@collation=p
inyin" }, | |
2074 { "zh_CN_STROKE", "zh_CN_STROKE", "zh_CN@collation=stroke" }, | |
2075 { "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin", "zh_CN_CA@co
llation=pinyin" }, | |
2076 { "en_US_POSIX", "en_US_POSIX", "en_US_POSIX" }, | |
2077 { "hy_AM_REVISED", "hy_AM_REVISED", "hy_AM_REVISED" }, | |
2078 { "no_NO_NY", "no_NO_NY", "no_NO_NY" /* not: "nn_NO" [alan ICU3.0] */ }, | |
2079 { "no@ny", "no@ny", "no__NY" /* not: "nn" [alan ICU3.0] */ }, /* POSIX I
D */ | |
2080 { "no-no.utf32@B", "no_NO.utf32@B", "no_NO_B" /* not: "nb_NO_B" [alan IC
U3.0] */ }, /* POSIX ID */ | |
2081 { "qz-qz@Euro", "qz_QZ@Euro", "qz_QZ@currency=EUR" }, /* qz-qz uses priv
ate use iso codes */ | |
2082 { "en-BOONT", "en__BOONT", "en__BOONT" }, /* registered name */ | |
2083 { "de-1901", "de__1901", "de__1901" }, /* registered name */ | |
2084 { "de-1906", "de__1906", "de__1906" }, /* registered name */ | |
2085 { "sr-SP-Cyrl", "sr_SP_CYRL", "sr_Cyrl_RS" }, /* .NET name */ | |
2086 { "sr-SP-Latn", "sr_SP_LATN", "sr_Latn_RS" }, /* .NET name */ | |
2087 { "sr_YU_CYRILLIC", "sr_YU_CYRILLIC", "sr_Cyrl_RS" }, /* Linux name */ | |
2088 { "uz-UZ-Cyrl", "uz_UZ_CYRL", "uz_Cyrl_UZ" }, /* .NET name */ | |
2089 { "uz-UZ-Latn", "uz_UZ_LATN", "uz_Latn_UZ" }, /* .NET name */ | |
2090 { "zh-CHS", "zh_CHS", "zh_Hans" }, /* .NET name */ | |
2091 { "zh-CHT", "zh_CHT", "zh_Hant" }, /* .NET name This may change back to
zh_Hant */ | |
2092 | |
2093 /* posix behavior that used to be performed by getName */ | |
2094 { "mr.utf8", "mr.utf8", "mr" }, | |
2095 { "de-tv.koi8r", "de_TV.koi8r", "de_TV" }, | |
2096 { "x-piglatin_ML.MBE", "x-piglatin_ML.MBE", "x-piglatin_ML" }, | |
2097 { "i-cherokee_US.utf7", "i-cherokee_US.utf7", "i-cherokee_US" }, | |
2098 { "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA.gb-18030", "x-filfl
i_MT_FILFLA" }, | |
2099 { "no-no-ny.utf8@B", "no_NO_NY.utf8@B", "no_NO_NY_B" /* not: "nn_NO" [al
an ICU3.0] */ }, /* @ ignored unless variant is empty */ | |
2100 | |
2101 /* fleshing out canonicalization */ | |
2102 /* trim space and sort keywords, ';' is separator so not present at end
in canonical form */ | |
2103 { "en_Hant_IL_VALLEY_GIRL@ currency = EUR; calendar = Japanese ;", "en_H
ant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@cale
ndar=Japanese;currency=EUR" }, | |
2104 /* already-canonical ids are not changed */ | |
2105 { "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_V
ALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Jap
anese;currency=EUR" }, | |
2106 /* PRE_EURO and EURO conversions don't affect other keywords */ | |
2107 { "es_ES_PREEURO@CALendar=Japanese", "es_ES_PREEURO@calendar=Japanese",
"es_ES@calendar=Japanese;currency=ESP" }, | |
2108 { "es_ES_EURO@SHOUT=zipeedeedoodah", "es_ES_EURO@shout=zipeedeedoodah",
"es_ES@currency=EUR;shout=zipeedeedoodah" }, | |
2109 /* currency keyword overrides PRE_EURO and EURO currency */ | |
2110 { "es_ES_PREEURO@currency=EUR", "es_ES_PREEURO@currency=EUR", "es_ES@cur
rency=EUR" }, | |
2111 { "es_ES_EURO@currency=ESP", "es_ES_EURO@currency=ESP", "es_ES@currency=
ESP" }, | |
2112 /* norwegian is just too weird, if we handle things in their full genera
lity */ | |
2113 { "no-Hant-GB_NY@currency=$$$", "no_Hant_GB_NY@currency=$$$", "no_Hant_G
B_NY@currency=$$$" /* not: "nn_Hant_GB@currency=$$$" [alan ICU3.0] */ }, | |
2114 | |
2115 /* test cases reflecting internal resource bundle usage */ | |
2116 { "root@kw=foo", "root@kw=foo", "root@kw=foo" }, | |
2117 { "@calendar=gregorian", "@calendar=gregorian", "@calendar=gregorian" }, | |
2118 { "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese", "ja_JP@calendar=
Japanese" }, | |
2119 { "ja_JP", "ja_JP", "ja_JP" }, | |
2120 | |
2121 /* test case for "i-default" */ | |
2122 { "i-default", "en@x=i-default", "en@x=i-default" } | |
2123 }; | |
2124 | |
2125 static const char* label[] = { "getName", "canonicalize" }; | |
2126 | |
2127 UErrorCode status = U_ZERO_ERROR; | |
2128 int32_t i, j, resultLen = 0, origResultLen; | |
2129 char buffer[256]; | |
2130 | |
2131 for (i=0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { | |
2132 for (j=0; j<2; ++j) { | |
2133 const char* expected = (j==0) ? testCases[i].getNameID : testCases[i
].canonicalID; | |
2134 *buffer = 0; | |
2135 status = U_ZERO_ERROR; | |
2136 | |
2137 if (expected == NULL) { | |
2138 expected = uloc_getDefault(); | |
2139 } | |
2140 | |
2141 /* log_verbose("testing %s -> %s\n", testCases[i], testCases[i].cano
nicalID); */ | |
2142 origResultLen = _canonicalize(j, testCases[i].localeID, NULL, 0, &st
atus); | |
2143 if (status != U_BUFFER_OVERFLOW_ERROR) { | |
2144 log_err("FAIL: uloc_%s(%s) => %s, expected U_BUFFER_OVERFLOW_ERR
OR\n", | |
2145 label[j], testCases[i].localeID, u_errorName(status)); | |
2146 continue; | |
2147 } | |
2148 status = U_ZERO_ERROR; | |
2149 resultLen = _canonicalize(j, testCases[i].localeID, buffer, sizeof(b
uffer), &status); | |
2150 if (U_FAILURE(status)) { | |
2151 log_err("FAIL: uloc_%s(%s) => %s, expected U_ZERO_ERROR\n", | |
2152 label[j], testCases[i].localeID, u_errorName(status)); | |
2153 continue; | |
2154 } | |
2155 if(uprv_strcmp(expected, buffer) != 0) { | |
2156 log_err("FAIL: uloc_%s(%s) => \"%s\", expected \"%s\"\n", | |
2157 label[j], testCases[i].localeID, buffer, expected); | |
2158 } else { | |
2159 log_verbose("Ok: uloc_%s(%s) => \"%s\"\n", | |
2160 label[j], testCases[i].localeID, buffer); | |
2161 } | |
2162 if (resultLen != (int32_t)strlen(buffer)) { | |
2163 log_err("FAIL: uloc_%s(%s) => len %d, expected len %d\n", | |
2164 label[j], testCases[i].localeID, resultLen, strlen(buffe
r)); | |
2165 } | |
2166 if (origResultLen != resultLen) { | |
2167 log_err("FAIL: uloc_%s(%s) => preflight len %d != actual len %d\
n", | |
2168 label[j], testCases[i].localeID, origResultLen, resultLe
n); | |
2169 } | |
2170 } | |
2171 } | |
2172 } | |
2173 | |
2174 static void TestDisplayKeywords(void) | |
2175 { | |
2176 int32_t i; | |
2177 | |
2178 static const struct { | |
2179 const char *localeID; | |
2180 const char *displayLocale; | |
2181 UChar displayKeyword[200]; | |
2182 } testCases[] = { | |
2183 { "ca_ES@currency=ESP", "de_AT", | |
2184 {0x0057, 0x00e4, 0x0068, 0x0072, 0x0075, 0x006e, 0x0067, 0x0000}, | |
2185 }, | |
2186 { "ja_JP@calendar=japanese", "de", | |
2187 { 0x004b, 0x0061, 0x006c, 0x0065, 0x006e, 0x0064, 0x0065, 0x0072, 0x
0000} | |
2188 }, | |
2189 { "de_DE@collation=traditional", "de_DE", | |
2190 {0x0053, 0x006f, 0x0072, 0x0074, 0x0069, 0x0065, 0x0072, 0x0075, 0x0
06e, 0x0067, 0x0000} | |
2191 }, | |
2192 }; | |
2193 for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { | |
2194 UErrorCode status = U_ZERO_ERROR; | |
2195 const char* keyword =NULL; | |
2196 int32_t keywordLen = 0; | |
2197 int32_t keywordCount = 0; | |
2198 UChar *displayKeyword=NULL; | |
2199 int32_t displayKeywordLen = 0; | |
2200 UEnumeration* keywordEnum = uloc_openKeywords(testCases[i].localeID, &st
atus); | |
2201 for(keywordCount = uenum_count(keywordEnum, &status); keywordCount > 0 ;
keywordCount--){ | |
2202 if(U_FAILURE(status)){ | |
2203 log_err("uloc_getKeywords failed for locale id: %s with error
: %s \n", testCases[i].localeID, u_errorName(status)); | |
2204 break; | |
2205 } | |
2206 /* the uenum_next returns NUL terminated string */ | |
2207 keyword = uenum_next(keywordEnum, &keywordLen, &status); | |
2208 /* fetch the displayKeyword */ | |
2209 displayKeywordLen = uloc_getDisplayKeyword(keyword, testCases[i].d
isplayLocale, displayKeyword, displayKeywordLen, &status); | |
2210 if(status==U_BUFFER_OVERFLOW_ERROR){ | |
2211 status = U_ZERO_ERROR; | |
2212 displayKeywordLen++; /* for null termination */ | |
2213 displayKeyword = (UChar*) malloc(displayKeywordLen * U_SIZEOF_
UCHAR); | |
2214 displayKeywordLen = uloc_getDisplayKeyword(keyword, testCases[
i].displayLocale, displayKeyword, displayKeywordLen, &status); | |
2215 if(U_FAILURE(status)){ | |
2216 log_err("uloc_getDisplayKeyword filed for keyword : %s in
locale id: %s for display locale: %s \n", testCases[i].localeID, keyword, testCa
ses[i].displayLocale, u_errorName(status)); | |
2217 break; | |
2218 } | |
2219 if(u_strncmp(displayKeyword, testCases[i].displayKeyword, disp
layKeywordLen)!=0){ | |
2220 if (status == U_USING_DEFAULT_WARNING) { | |
2221 log_data_err("uloc_getDisplayKeyword did not get the e
xpected value for keyword : %s in locale id: %s for display locale: %s . Got err
or: %s. Perhaps you are missing data?\n", testCases[i].localeID, keyword, testCa
ses[i].displayLocale, u_errorName(status)); | |
2222 } else { | |
2223 log_err("uloc_getDisplayKeyword did not get the expect
ed value for keyword : %s in locale id: %s for display locale: %s \n", testCases
[i].localeID, keyword, testCases[i].displayLocale); | |
2224 } | |
2225 break; | |
2226 } | |
2227 }else{ | |
2228 log_err("uloc_getDisplayKeyword did not return the expected er
ror. Error: %s\n", u_errorName(status)); | |
2229 } | |
2230 | |
2231 free(displayKeyword); | |
2232 | |
2233 } | |
2234 uenum_close(keywordEnum); | |
2235 } | |
2236 } | |
2237 | |
2238 static void TestDisplayKeywordValues(void){ | |
2239 int32_t i; | |
2240 | |
2241 static const struct { | |
2242 const char *localeID; | |
2243 const char *displayLocale; | |
2244 UChar displayKeywordValue[500]; | |
2245 } testCases[] = { | |
2246 { "ca_ES@currency=ESP", "de_AT", | |
2247 {0x0053, 0x0070, 0x0061, 0x006e, 0x0069, 0x0073, 0x0063, 0x0068, 0x0
065, 0x0020, 0x0050, 0x0065, 0x0073, 0x0065, 0x0074, 0x0061, 0x0000} | |
2248 }, | |
2249 { "de_AT@currency=ATS", "fr_FR", | |
2250 {0x0073, 0x0063, 0x0068, 0x0069, 0x006c, 0x006c, 0x0069, 0x006e, 0x0
067, 0x0020, 0x0061, 0x0075, 0x0074, 0x0072, 0x0069, 0x0063, 0x0068, 0x0069, 0x0
065, 0x006e, 0x0000} | |
2251 }, | |
2252 { "de_DE@currency=DEM", "it", | |
2253 {0x006d, 0x0061, 0x0072, 0x0063, 0x006f, 0x0020, 0x0074, 0x0065, 0x0
064, 0x0065, 0x0073, 0x0063, 0x006f, 0x0000} | |
2254 }, | |
2255 { "el_GR@currency=GRD", "en", | |
2256 {0x0047, 0x0072, 0x0065, 0x0065, 0x006b, 0x0020, 0x0044, 0x0072, 0x0
061, 0x0063, 0x0068, 0x006d, 0x0061, 0x0000} | |
2257 }, | |
2258 { "eu_ES@currency=ESP", "it_IT", | |
2259 {0x0070, 0x0065, 0x0073, 0x0065, 0x0074, 0x0061, 0x0020, 0x0073, 0x0
070, 0x0061, 0x0067, 0x006e, 0x006f, 0x006c, 0x0061, 0x0000} | |
2260 }, | |
2261 { "de@collation=phonebook", "es", | |
2262 {0x006F, 0x0072, 0x0064, 0x0065, 0x006E, 0x0020, 0x0064, 0x0065, 0x0
020, 0x006C, 0x0069, 0x0073, 0x0074, 0x00ED, 0x006E, 0x0020, 0x0074, 0x0065, 0x0
06C, 0x0065, 0x0066, 0x00F3, 0x006E, 0x0069, 0x0063, 0x006F, 0x0000} | |
2263 }, | |
2264 | |
2265 { "de_DE@collation=phonebook", "es", | |
2266 {0x006F, 0x0072, 0x0064, 0x0065, 0x006E, 0x0020, 0x0064, 0x0065, 0x002
0, 0x006C, 0x0069, 0x0073, 0x0074, 0x00ED, 0x006E, 0x0020, 0x0074, 0x0065, 0x006
C, 0x0065, 0x0066, 0x00F3, 0x006E, 0x0069, 0x0063, 0x006F, 0x0000} | |
2267 }, | |
2268 { "es_ES@collation=traditional","de", | |
2269 {0x0054, 0x0072, 0x0061, 0x0064, 0x0069, 0x0074, 0x0069, 0x006f, 0x006
e, 0x0065, 0x006c, 0x006c, 0x0065, 0x0020, 0x0053, 0x006f, 0x0072, 0x0074, 0x006
9, 0x0065, 0x0072, 0x0072, 0x0065, 0x0067, 0x0065, 0x006c, 0x006e, 0x0000} | |
2270 }, | |
2271 { "ja_JP@calendar=japanese", "de", | |
2272 {0x004a, 0x0061, 0x0070, 0x0061, 0x006e, 0x0069, 0x0073, 0x0063, 0x00
68, 0x0065, 0x0072, 0x0020, 0x004b, 0x0061, 0x006c, 0x0065, 0x006e, 0x0064, 0x00
65, 0x0072, 0x0000} | |
2273 }, | |
2274 }; | |
2275 for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { | |
2276 UErrorCode status = U_ZERO_ERROR; | |
2277 const char* keyword =NULL; | |
2278 int32_t keywordLen = 0; | |
2279 int32_t keywordCount = 0; | |
2280 UChar *displayKeywordValue = NULL; | |
2281 int32_t displayKeywordValueLen = 0; | |
2282 UEnumeration* keywordEnum = uloc_openKeywords(testCases[i].localeID, &st
atus); | |
2283 for(keywordCount = uenum_count(keywordEnum, &status); keywordCount > 0 ;
keywordCount--){ | |
2284 if(U_FAILURE(status)){ | |
2285 log_err("uloc_getKeywords failed for locale id: %s in display
locale: % with error : %s \n", testCases[i].localeID, testCases[i].displayLocale
, u_errorName(status)); | |
2286 break; | |
2287 } | |
2288 /* the uenum_next returns NUL terminated string */ | |
2289 keyword = uenum_next(keywordEnum, &keywordLen, &status); | |
2290 | |
2291 /* fetch the displayKeywordValue */ | |
2292 displayKeywordValueLen = uloc_getDisplayKeywordValue(testCases[i].
localeID, keyword, testCases[i].displayLocale, displayKeywordValue, displayKeywo
rdValueLen, &status); | |
2293 if(status==U_BUFFER_OVERFLOW_ERROR){ | |
2294 status = U_ZERO_ERROR; | |
2295 displayKeywordValueLen++; /* for null termination */ | |
2296 displayKeywordValue = (UChar*)malloc(displayKeywordValueLen *
U_SIZEOF_UCHAR); | |
2297 displayKeywordValueLen = uloc_getDisplayKeywordValue(testCases
[i].localeID, keyword, testCases[i].displayLocale, displayKeywordValue, displayK
eywordValueLen, &status); | |
2298 if(U_FAILURE(status)){ | |
2299 log_err("uloc_getDisplayKeywordValue failed for keyword :
%s in locale id: %s for display locale: %s with error : %s \n", testCases[i].loc
aleID, keyword, testCases[i].displayLocale, u_errorName(status)); | |
2300 break; | |
2301 } | |
2302 if(u_strncmp(displayKeywordValue, testCases[i].displayKeywordV
alue, displayKeywordValueLen)!=0){ | |
2303 if (status == U_USING_DEFAULT_WARNING) { | |
2304 log_data_err("uloc_getDisplayKeywordValue did not retu
rn the expected value keyword : %s in locale id: %s for display locale: %s with
error : %s Perhaps you are missing data\n", testCases[i].localeID, keyword, test
Cases[i].displayLocale, u_errorName(status)); | |
2305 } else { | |
2306 log_err("uloc_getDisplayKeywordValue did not return th
e expected value keyword : %s in locale id: %s for display locale: %s with error
: %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorNa
me(status)); | |
2307 } | |
2308 break; | |
2309 } | |
2310 }else{ | |
2311 log_err("uloc_getDisplayKeywordValue did not return the expect
ed error. Error: %s\n", u_errorName(status)); | |
2312 } | |
2313 free(displayKeywordValue); | |
2314 } | |
2315 uenum_close(keywordEnum); | |
2316 } | |
2317 { | |
2318 /* test a multiple keywords */ | |
2319 UErrorCode status = U_ZERO_ERROR; | |
2320 const char* keyword =NULL; | |
2321 int32_t keywordLen = 0; | |
2322 int32_t keywordCount = 0; | |
2323 const char* localeID = "es@collation=phonebook;calendar=buddhist;currenc
y=DEM"; | |
2324 const char* displayLocale = "de"; | |
2325 static const UChar expected[][50] = { | |
2326 {0x0042, 0x0075, 0x0064, 0x0064, 0x0068, 0x0069, 0x0073, 0x0074, 0x0
069, 0x0073, 0x0063, 0x0068, 0x0065, 0x0072, 0x0020, 0x004b, 0x0061, 0x006c, 0x0
065, 0x006e, 0x0064, 0x0065, 0x0072, 0x0000}, | |
2327 | |
2328 {0x0054, 0x0065, 0x006c, 0x0065, 0x0066, 0x006f, 0x006e, 0x0062, 0x0
075, 0x0063, 0x0068, 0x002d, 0x0053, 0x006f, 0x0072, 0x0074, 0x0069, 0x0065, 0x0
072, 0x0075, 0x006e, 0x0067, 0x0000}, | |
2329 {0x0044, 0x0065, 0x0075, 0x0074, 0x0073, 0x0063, 0x0068, 0x0065, 0x0
020, 0x004d, 0x0061, 0x0072, 0x006b, 0x0000}, | |
2330 }; | |
2331 | |
2332 UEnumeration* keywordEnum = uloc_openKeywords(localeID, &status); | |
2333 | |
2334 for(keywordCount = 0; keywordCount < uenum_count(keywordEnum, &status) ;
keywordCount++){ | |
2335 UChar *displayKeywordValue = NULL; | |
2336 int32_t displayKeywordValueLen = 0; | |
2337 if(U_FAILURE(status)){ | |
2338 log_err("uloc_getKeywords failed for locale id: %s in display
locale: % with error : %s \n", localeID, displayLocale, u_errorName(status)); | |
2339 break; | |
2340 } | |
2341 /* the uenum_next returns NUL terminated string */ | |
2342 keyword = uenum_next(keywordEnum, &keywordLen, &status); | |
2343 | |
2344 /* fetch the displayKeywordValue */ | |
2345 displayKeywordValueLen = uloc_getDisplayKeywordValue(localeID, key
word, displayLocale, displayKeywordValue, displayKeywordValueLen, &status); | |
2346 if(status==U_BUFFER_OVERFLOW_ERROR){ | |
2347 status = U_ZERO_ERROR; | |
2348 displayKeywordValueLen++; /* for null termination */ | |
2349 displayKeywordValue = (UChar*)malloc(displayKeywordValueLen *
U_SIZEOF_UCHAR); | |
2350 displayKeywordValueLen = uloc_getDisplayKeywordValue(localeID,
keyword, displayLocale, displayKeywordValue, displayKeywordValueLen, &status); | |
2351 if(U_FAILURE(status)){ | |
2352 log_err("uloc_getDisplayKeywordValue failed for keyword :
%s in locale id: %s for display locale: %s with error : %s \n", localeID, keywor
d, displayLocale, u_errorName(status)); | |
2353 break; | |
2354 } | |
2355 if(u_strncmp(displayKeywordValue, expected[keywordCount], disp
layKeywordValueLen)!=0){ | |
2356 if (status == U_USING_DEFAULT_WARNING) { | |
2357 log_data_err("uloc_getDisplayKeywordValue did not retu
rn the expected value keyword : %s in locale id: %s for display locale: %s got
error: %s. Perhaps you are missing data?\n", localeID, keyword, displayLocale, u
_errorName(status)); | |
2358 } else { | |
2359 log_err("uloc_getDisplayKeywordValue did not return th
e expected value keyword : %s in locale id: %s for display locale: %s \n", local
eID, keyword, displayLocale); | |
2360 } | |
2361 break; | |
2362 } | |
2363 }else{ | |
2364 log_err("uloc_getDisplayKeywordValue did not return the expect
ed error. Error: %s\n", u_errorName(status)); | |
2365 } | |
2366 free(displayKeywordValue); | |
2367 } | |
2368 uenum_close(keywordEnum); | |
2369 | |
2370 } | |
2371 { | |
2372 /* Test non existent keywords */ | |
2373 UErrorCode status = U_ZERO_ERROR; | |
2374 const char* localeID = "es"; | |
2375 const char* displayLocale = "de"; | |
2376 UChar *displayKeywordValue = NULL; | |
2377 int32_t displayKeywordValueLen = 0; | |
2378 | |
2379 /* fetch the displayKeywordValue */ | |
2380 displayKeywordValueLen = uloc_getDisplayKeywordValue(localeID, "calendar
", displayLocale, displayKeywordValue, displayKeywordValueLen, &status); | |
2381 if(U_FAILURE(status)) { | |
2382 log_err("uloc_getDisplaykeywordValue returned error status %s\n", u_er
rorName(status)); | |
2383 } else if(displayKeywordValueLen != 0) { | |
2384 log_err("uloc_getDisplaykeywordValue returned %d should be 0 \n", disp
layKeywordValueLen); | |
2385 } | |
2386 } | |
2387 } | |
2388 | |
2389 | |
2390 static void TestGetBaseName(void) { | |
2391 static const struct { | |
2392 const char *localeID; | |
2393 const char *baseName; | |
2394 } testCases[] = { | |
2395 { "de_DE@ C o ll A t i o n = Phonebook ", "de_DE" }, | |
2396 { "de@currency = euro; CoLLaTion = PHONEBOOk", "de" }, | |
2397 { "ja@calendar = buddhist", "ja" } | |
2398 }; | |
2399 | |
2400 int32_t i = 0, baseNameLen = 0; | |
2401 char baseName[256]; | |
2402 UErrorCode status = U_ZERO_ERROR; | |
2403 | |
2404 for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { | |
2405 baseNameLen = uloc_getBaseName(testCases[i].localeID, baseName, 256, &st
atus); | |
2406 (void)baseNameLen; /* Suppress set but not used warning. */ | |
2407 if(strcmp(testCases[i].baseName, baseName)) { | |
2408 log_err("For locale \"%s\" expected baseName \"%s\", but got \"%s\"\
n", | |
2409 testCases[i].localeID, testCases[i].baseName, baseName); | |
2410 return; | |
2411 } | |
2412 } | |
2413 } | |
2414 | |
2415 static void TestTrailingNull(void) { | |
2416 const char* localeId = "zh_Hans"; | |
2417 UChar buffer[128]; /* sufficient for this test */ | |
2418 int32_t len; | |
2419 UErrorCode status = U_ZERO_ERROR; | |
2420 int i; | |
2421 | |
2422 len = uloc_getDisplayName(localeId, localeId, buffer, 128, &status); | |
2423 if (len > 128) { | |
2424 log_err("buffer too small"); | |
2425 return; | |
2426 } | |
2427 | |
2428 for (i = 0; i < len; ++i) { | |
2429 if (buffer[i] == 0) { | |
2430 log_err("name contained null"); | |
2431 return; | |
2432 } | |
2433 } | |
2434 } | |
2435 | |
2436 /* Jitterbug 4115 */ | |
2437 static void TestDisplayNameWarning(void) { | |
2438 UChar name[256]; | |
2439 int32_t size; | |
2440 UErrorCode status = U_ZERO_ERROR; | |
2441 | |
2442 size = uloc_getDisplayLanguage("qqq", "kl", name, sizeof(name)/sizeof(name[0
]), &status); | |
2443 (void)size; /* Suppress set but not used warning. */ | |
2444 if (status != U_USING_DEFAULT_WARNING) { | |
2445 log_err("For language \"qqq\" in locale \"kl\", expecting U_USING_DEFAUL
T_WARNING, but got %s\n", | |
2446 u_errorName(status)); | |
2447 } | |
2448 } | |
2449 | |
2450 | |
2451 /** | |
2452 * Compare two locale IDs. If they are equal, return 0. If `string' | |
2453 * starts with `prefix' plus an additional element, that is, string == | |
2454 * prefix + '_' + x, then return 1. Otherwise return a value < 0. | |
2455 */ | |
2456 static UBool _loccmp(const char* string, const char* prefix) { | |
2457 int32_t slen = (int32_t)uprv_strlen(string), | |
2458 plen = (int32_t)uprv_strlen(prefix); | |
2459 int32_t c = uprv_strncmp(string, prefix, plen); | |
2460 /* 'root' is less than everything */ | |
2461 if (uprv_strcmp(prefix, "root") == 0) { | |
2462 return (uprv_strcmp(string, "root") == 0) ? 0 : 1; | |
2463 } | |
2464 if (c) return -1; /* mismatch */ | |
2465 if (slen == plen) return 0; | |
2466 if (string[plen] == '_') return 1; | |
2467 return -2; /* false match, e.g. "en_USX" cmp "en_US" */ | |
2468 } | |
2469 | |
2470 static void _checklocs(const char* label, | |
2471 const char* req, | |
2472 const char* valid, | |
2473 const char* actual) { | |
2474 /* We want the valid to be strictly > the bogus requested locale, | |
2475 and the valid to be >= the actual. */ | |
2476 if (_loccmp(req, valid) > 0 && | |
2477 _loccmp(valid, actual) >= 0) { | |
2478 log_verbose("%s; req=%s, valid=%s, actual=%s\n", | |
2479 label, req, valid, actual); | |
2480 } else { | |
2481 log_err("FAIL: %s; req=%s, valid=%s, actual=%s\n", | |
2482 label, req, valid, actual); | |
2483 } | |
2484 } | |
2485 | |
2486 static void TestGetLocale(void) { | |
2487 UErrorCode ec = U_ZERO_ERROR; | |
2488 UParseError pe; | |
2489 UChar EMPTY[1] = {0}; | |
2490 | |
2491 /* === udat === */ | |
2492 #if !UCONFIG_NO_FORMATTING | |
2493 { | |
2494 UDateFormat *obj; | |
2495 const char *req = "en_US_REDWOODSHORES", *valid, *actual; | |
2496 obj = udat_open(UDAT_DEFAULT, UDAT_DEFAULT, | |
2497 req, | |
2498 NULL, 0, | |
2499 NULL, 0, &ec); | |
2500 if (U_FAILURE(ec)) { | |
2501 log_data_err("udat_open failed.Error %s\n", u_errorName(ec)); | |
2502 return; | |
2503 } | |
2504 valid = udat_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); | |
2505 actual = udat_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); | |
2506 if (U_FAILURE(ec)) { | |
2507 log_err("udat_getLocaleByType() failed\n"); | |
2508 return; | |
2509 } | |
2510 _checklocs("udat", req, valid, actual); | |
2511 udat_close(obj); | |
2512 } | |
2513 #endif | |
2514 | |
2515 /* === ucal === */ | |
2516 #if !UCONFIG_NO_FORMATTING | |
2517 { | |
2518 UCalendar *obj; | |
2519 const char *req = "fr_FR_PROVENCAL", *valid, *actual; | |
2520 obj = ucal_open(NULL, 0, | |
2521 req, | |
2522 UCAL_GREGORIAN, | |
2523 &ec); | |
2524 if (U_FAILURE(ec)) { | |
2525 log_err("ucal_open failed with error: %s\n", u_errorName(ec)); | |
2526 return; | |
2527 } | |
2528 valid = ucal_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); | |
2529 actual = ucal_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); | |
2530 if (U_FAILURE(ec)) { | |
2531 log_err("ucal_getLocaleByType() failed\n"); | |
2532 return; | |
2533 } | |
2534 _checklocs("ucal", req, valid, actual); | |
2535 ucal_close(obj); | |
2536 } | |
2537 #endif | |
2538 | |
2539 /* === unum === */ | |
2540 #if !UCONFIG_NO_FORMATTING | |
2541 { | |
2542 UNumberFormat *obj; | |
2543 const char *req = "zh_Hant_TW_TAINAN", *valid, *actual; | |
2544 obj = unum_open(UNUM_DECIMAL, | |
2545 NULL, 0, | |
2546 req, | |
2547 &pe, &ec); | |
2548 if (U_FAILURE(ec)) { | |
2549 log_err("unum_open failed\n"); | |
2550 return; | |
2551 } | |
2552 valid = unum_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); | |
2553 actual = unum_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); | |
2554 if (U_FAILURE(ec)) { | |
2555 log_err("unum_getLocaleByType() failed\n"); | |
2556 return; | |
2557 } | |
2558 _checklocs("unum", req, valid, actual); | |
2559 unum_close(obj); | |
2560 } | |
2561 #endif | |
2562 | |
2563 /* === umsg === */ | |
2564 #if 0 | |
2565 /* commented out by weiv 01/12/2005. umsg_getLocaleByType is to be removed *
/ | |
2566 #if !UCONFIG_NO_FORMATTING | |
2567 { | |
2568 UMessageFormat *obj; | |
2569 const char *req = "ja_JP_TAKAYAMA", *valid, *actual; | |
2570 UBool test; | |
2571 obj = umsg_open(EMPTY, 0, | |
2572 req, | |
2573 &pe, &ec); | |
2574 if (U_FAILURE(ec)) { | |
2575 log_err("umsg_open failed\n"); | |
2576 return; | |
2577 } | |
2578 valid = umsg_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); | |
2579 actual = umsg_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); | |
2580 if (U_FAILURE(ec)) { | |
2581 log_err("umsg_getLocaleByType() failed\n"); | |
2582 return; | |
2583 } | |
2584 /* We want the valid to be strictly > the bogus requested locale, | |
2585 and the valid to be >= the actual. */ | |
2586 /* TODO MessageFormat is currently just storing the locale it is given. | |
2587 As a result, it will return whatever it was given, even if the | |
2588 locale is invalid. */ | |
2589 test = (_cmpversion("3.2") <= 0) ? | |
2590 /* Here is the weakened test for 3.0: */ | |
2591 (_loccmp(req, valid) >= 0) : | |
2592 /* Here is what the test line SHOULD be: */ | |
2593 (_loccmp(req, valid) > 0); | |
2594 | |
2595 if (test && | |
2596 _loccmp(valid, actual) >= 0) { | |
2597 log_verbose("umsg; req=%s, valid=%s, actual=%s\n", req, valid, actua
l); | |
2598 } else { | |
2599 log_err("FAIL: umsg; req=%s, valid=%s, actual=%s\n", req, valid, act
ual); | |
2600 } | |
2601 umsg_close(obj); | |
2602 } | |
2603 #endif | |
2604 #endif | |
2605 | |
2606 /* === ubrk === */ | |
2607 #if !UCONFIG_NO_BREAK_ITERATION | |
2608 { | |
2609 UBreakIterator *obj; | |
2610 const char *req = "ar_KW_ABDALI", *valid, *actual; | |
2611 obj = ubrk_open(UBRK_WORD, | |
2612 req, | |
2613 EMPTY, | |
2614 0, | |
2615 &ec); | |
2616 if (U_FAILURE(ec)) { | |
2617 log_err("ubrk_open failed. Error: %s \n", u_errorName(ec)); | |
2618 return; | |
2619 } | |
2620 valid = ubrk_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); | |
2621 actual = ubrk_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); | |
2622 if (U_FAILURE(ec)) { | |
2623 log_err("ubrk_getLocaleByType() failed\n"); | |
2624 return; | |
2625 } | |
2626 _checklocs("ubrk", req, valid, actual); | |
2627 ubrk_close(obj); | |
2628 } | |
2629 #endif | |
2630 | |
2631 /* === ucol === */ | |
2632 #if !UCONFIG_NO_COLLATION | |
2633 { | |
2634 UCollator *obj; | |
2635 const char *req = "es_AR_BUENOSAIRES", *valid, *actual; | |
2636 obj = ucol_open(req, &ec); | |
2637 if (U_FAILURE(ec)) { | |
2638 log_err("ucol_open failed - %s\n", u_errorName(ec)); | |
2639 return; | |
2640 } | |
2641 valid = ucol_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); | |
2642 actual = ucol_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); | |
2643 if (U_FAILURE(ec)) { | |
2644 log_err("ucol_getLocaleByType() failed\n"); | |
2645 return; | |
2646 } | |
2647 _checklocs("ucol", req, valid, actual); | |
2648 ucol_close(obj); | |
2649 } | |
2650 #endif | |
2651 } | |
2652 static void TestEnglishExemplarCharacters(void) { | |
2653 UErrorCode status = U_ZERO_ERROR; | |
2654 int i; | |
2655 USet *exSet = NULL; | |
2656 UChar testChars[] = { | |
2657 0x61, /* standard */ | |
2658 0xE1, /* auxiliary */ | |
2659 0x41, /* index */ | |
2660 0x2D /* punctuation */ | |
2661 }; | |
2662 ULocaleData *uld = ulocdata_open("en", &status); | |
2663 if (U_FAILURE(status)) { | |
2664 log_data_err("ulocdata_open() failed : %s - (Are you missing data?)\n",
u_errorName(status)); | |
2665 return; | |
2666 } | |
2667 | |
2668 for (i = 0; i < ULOCDATA_ES_COUNT; i++) { | |
2669 exSet = ulocdata_getExemplarSet(uld, exSet, 0, (ULocaleDataExemplarSetTy
pe)i, &status); | |
2670 if (U_FAILURE(status)) { | |
2671 log_err_status(status, "ulocdata_getExemplarSet() for type %d failed
\n", i); | |
2672 status = U_ZERO_ERROR; | |
2673 continue; | |
2674 } | |
2675 if (!uset_contains(exSet, (UChar32)testChars[i])) { | |
2676 log_err("Character U+%04X is not included in exemplar type %d\n", te
stChars[i], i); | |
2677 } | |
2678 } | |
2679 | |
2680 uset_close(exSet); | |
2681 ulocdata_close(uld); | |
2682 } | |
2683 | |
2684 static void TestNonexistentLanguageExemplars(void) { | |
2685 /* JB 4068 - Nonexistent language */ | |
2686 UErrorCode ec = U_ZERO_ERROR; | |
2687 ULocaleData *uld = ulocdata_open("qqq",&ec); | |
2688 if (ec != U_USING_DEFAULT_WARNING) { | |
2689 log_err_status(ec, "Exemplar set for \"qqq\", expecting U_USING_DEFAULT_
WARNING, but got %s\n", | |
2690 u_errorName(ec)); | |
2691 } | |
2692 uset_close(ulocdata_getExemplarSet(uld, NULL, 0, ULOCDATA_ES_STANDARD, &ec))
; | |
2693 ulocdata_close(uld); | |
2694 } | |
2695 | |
2696 static void TestLocDataErrorCodeChaining(void) { | |
2697 UErrorCode ec = U_USELESS_COLLATOR_ERROR; | |
2698 ulocdata_open(NULL, &ec); | |
2699 ulocdata_getExemplarSet(NULL, NULL, 0, ULOCDATA_ES_STANDARD, &ec); | |
2700 ulocdata_getDelimiter(NULL, ULOCDATA_DELIMITER_COUNT, NULL, -1, &ec); | |
2701 ulocdata_getMeasurementSystem(NULL, &ec); | |
2702 ulocdata_getPaperSize(NULL, NULL, NULL, &ec); | |
2703 if (ec != U_USELESS_COLLATOR_ERROR) { | |
2704 log_err("ulocdata API changed the error code to %s\n", u_errorName(ec)); | |
2705 } | |
2706 } | |
2707 | |
2708 static void TestLanguageExemplarsFallbacks(void) { | |
2709 /* Test that en_US fallsback, but en doesn't fallback. */ | |
2710 UErrorCode ec = U_ZERO_ERROR; | |
2711 ULocaleData *uld = ulocdata_open("en_US",&ec); | |
2712 uset_close(ulocdata_getExemplarSet(uld, NULL, 0, ULOCDATA_ES_STANDARD, &ec))
; | |
2713 if (ec != U_USING_FALLBACK_WARNING) { | |
2714 log_err_status(ec, "Exemplar set for \"en_US\", expecting U_USING_FALLBA
CK_WARNING, but got %s\n", | |
2715 u_errorName(ec)); | |
2716 } | |
2717 ulocdata_close(uld); | |
2718 ec = U_ZERO_ERROR; | |
2719 uld = ulocdata_open("en",&ec); | |
2720 uset_close(ulocdata_getExemplarSet(uld, NULL, 0, ULOCDATA_ES_STANDARD, &ec))
; | |
2721 if (ec != U_ZERO_ERROR) { | |
2722 log_err_status(ec, "Exemplar set for \"en\", expecting U_ZERO_ERROR, but
got %s\n", | |
2723 u_errorName(ec)); | |
2724 } | |
2725 ulocdata_close(uld); | |
2726 } | |
2727 | |
2728 static const char *acceptResult(UAcceptResult uar) { | |
2729 return udbg_enumName(UDBG_UAcceptResult, uar); | |
2730 } | |
2731 | |
2732 static void TestAcceptLanguage(void) { | |
2733 UErrorCode status = U_ZERO_ERROR; | |
2734 UAcceptResult outResult; | |
2735 UEnumeration *available; | |
2736 char tmp[200]; | |
2737 int i; | |
2738 int32_t rc = 0; | |
2739 | |
2740 struct { | |
2741 int32_t httpSet; /**< Which of http[] should be used? */ | |
2742 const char *icuSet; /**< ? */ | |
2743 const char *expect; /**< The expected locale result */ | |
2744 UAcceptResult res; /**< The expected error code */ | |
2745 } tests[] = { | |
2746 /*0*/{ 0, NULL, "mt_MT", ULOC_ACCEPT_VALID }, | |
2747 /*1*/{ 1, NULL, "en", ULOC_ACCEPT_VALID }, | |
2748 /*2*/{ 2, NULL, "en", ULOC_ACCEPT_FALLBACK }, | |
2749 /*3*/{ 3, NULL, "", ULOC_ACCEPT_FAILED }, | |
2750 /*4*/{ 4, NULL, "es", ULOC_ACCEPT_VALID }, | |
2751 | |
2752 /*5*/{ 5, NULL, "en", ULOC_ACCEPT_VALID }, /* XF */ | |
2753 /*6*/{ 6, NULL, "ja", ULOC_ACCEPT_FALLBACK }, /* XF */ | |
2754 /*7*/{ 7, NULL, "zh", ULOC_ACCEPT_FALLBACK }, /* XF */ | |
2755 }; | |
2756 const int32_t numTests = sizeof(tests)/sizeof(tests[0]); | |
2757 static const char *http[] = { | |
2758 /*0*/ "mt-mt, ja;q=0.76, en-us;q=0.95, en;q=0.92, en-gb;q=0.89, fr;q=0.8
7, 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", | |
2759 /*1*/ "ja;q=0.5, en;q=0.8, tlh", | |
2760 /*2*/ "en-wf, de-lx;q=0.8", | |
2761 /*3*/ "mga-ie;q=0.9, tlh", | |
2762 /*4*/ "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-y
yy;q=.01, " | |
2763 "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-y
yy;q=.01, " | |
2764 "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-y
yy;q=.01, " | |
2765 "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-y
yy;q=.01, " | |
2766 "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-y
yy;q=.01, " | |
2767 "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-y
yy;q=.01, " | |
2768 "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xx-yy;q=.1, " | |
2769 "es", | |
2770 | |
2771 /*5*/ "zh-xx;q=0.9, en;q=0.6", | |
2772 /*6*/ "ja-JA", | |
2773 /*7*/ "zh-xx;q=0.9", | |
2774 }; | |
2775 | |
2776 for(i=0;i<numTests;i++) { | |
2777 outResult = -3; | |
2778 status=U_ZERO_ERROR; | |
2779 log_verbose("test #%d: http[%s], ICU[%s], expect %s, %s\n", | |
2780 i, http[tests[i].httpSet], tests[i].icuSet, tests[i].expect, acceptR
esult(tests[i].res)); | |
2781 | |
2782 available = ures_openAvailableLocales(tests[i].icuSet, &status); | |
2783 tmp[0]=0; | |
2784 rc = uloc_acceptLanguageFromHTTP(tmp, 199, &outResult, http[tests[i].htt
pSet], available, &status); | |
2785 (void)rc; /* Suppress set but not used warning. */ | |
2786 uenum_close(available); | |
2787 log_verbose(" got %s, %s [%s]\n", tmp[0]?tmp:"(EMPTY)", acceptResult(out
Result), u_errorName(status)); | |
2788 if(outResult != tests[i].res) { | |
2789 log_err_status(status, "FAIL: #%d: expected outResult of %s but got
%s\n", i, | |
2790 acceptResult( tests[i].res), | |
2791 acceptResult( outResult)); | |
2792 log_info("test #%d: http[%s], ICU[%s], expect %s, %s\n", | |
2793 i, http[tests[i].httpSet], tests[i].icuSet, tests[i].expect,acce
ptResult(tests[i].res)); | |
2794 } | |
2795 if((outResult>0)&&uprv_strcmp(tmp, tests[i].expect)) { | |
2796 log_err_status(status, "FAIL: #%d: expected %s but got %s\n", i, tes
ts[i].expect, tmp); | |
2797 log_info("test #%d: http[%s], ICU[%s], expect %s, %s\n", | |
2798 i, http[tests[i].httpSet], tests[i].icuSet, tests[i].expect, acc
eptResult(tests[i].res)); | |
2799 } | |
2800 } | |
2801 } | |
2802 | |
2803 static const char* LOCALE_ALIAS[][2] = { | |
2804 {"in", "id"}, | |
2805 {"in_ID", "id_ID"}, | |
2806 {"iw", "he"}, | |
2807 {"iw_IL", "he_IL"}, | |
2808 {"ji", "yi"}, | |
2809 {"en_BU", "en_MM"}, | |
2810 {"en_DY", "en_BJ"}, | |
2811 {"en_HV", "en_BF"}, | |
2812 {"en_NH", "en_VU"}, | |
2813 {"en_RH", "en_ZW"}, | |
2814 {"en_TP", "en_TL"}, | |
2815 {"en_ZR", "en_CD"} | |
2816 }; | |
2817 static UBool isLocaleAvailable(UResourceBundle* resIndex, const char* loc){ | |
2818 UErrorCode status = U_ZERO_ERROR; | |
2819 int32_t len = 0; | |
2820 ures_getStringByKey(resIndex, loc,&len, &status); | |
2821 if(U_FAILURE(status)){ | |
2822 return FALSE; | |
2823 } | |
2824 return TRUE; | |
2825 } | |
2826 | |
2827 static void TestCalendar() { | |
2828 #if !UCONFIG_NO_FORMATTING | |
2829 int i; | |
2830 UErrorCode status = U_ZERO_ERROR; | |
2831 UResourceBundle *resIndex = ures_open(NULL,"res_index", &status); | |
2832 if(U_FAILURE(status)){ | |
2833 log_err_status(status, "Could not open res_index.res. Exiting. Error: %s
\n", u_errorName(status)); | |
2834 return; | |
2835 } | |
2836 for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) { | |
2837 const char* oldLoc = LOCALE_ALIAS[i][0]; | |
2838 const char* newLoc = LOCALE_ALIAS[i][1]; | |
2839 UCalendar* c1 = NULL; | |
2840 UCalendar* c2 = NULL; | |
2841 | |
2842 /*Test function "getLocale(ULocale.VALID_LOCALE)"*/ | |
2843 const char* l1 = ucal_getLocaleByType(c1, ULOC_VALID_LOCALE, &status); | |
2844 const char* l2 = ucal_getLocaleByType(c2, ULOC_VALID_LOCALE, &status); | |
2845 | |
2846 if(!isLocaleAvailable(resIndex, newLoc)){ | |
2847 continue; | |
2848 } | |
2849 c1 = ucal_open(NULL, -1, oldLoc, UCAL_GREGORIAN, &status); | |
2850 c2 = ucal_open(NULL, -1, newLoc, UCAL_GREGORIAN, &status); | |
2851 | |
2852 if (strcmp(newLoc,l1)!=0 || strcmp(l1,l2)!=0 || status!=U_ZERO_ERROR) { | |
2853 log_err("The locales are not equal!.Old: %s, New: %s \n", oldLoc, ne
wLoc); | |
2854 } | |
2855 log_verbose("ucal_getLocaleByType old:%s new:%s\n", l1, l2); | |
2856 ucal_close(c1); | |
2857 ucal_close(c2); | |
2858 } | |
2859 ures_close(resIndex); | |
2860 #endif | |
2861 } | |
2862 | |
2863 static void TestDateFormat() { | |
2864 #if !UCONFIG_NO_FORMATTING | |
2865 int i; | |
2866 UErrorCode status = U_ZERO_ERROR; | |
2867 UResourceBundle *resIndex = ures_open(NULL,"res_index", &status); | |
2868 if(U_FAILURE(status)){ | |
2869 log_err_status(status, "Could not open res_index.res. Exiting. Error: %s
\n", u_errorName(status)); | |
2870 return; | |
2871 } | |
2872 for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) { | |
2873 const char* oldLoc = LOCALE_ALIAS[i][0]; | |
2874 const char* newLoc = LOCALE_ALIAS[i][1]; | |
2875 UDateFormat* df1 = NULL; | |
2876 UDateFormat* df2 = NULL; | |
2877 const char* l1 = NULL; | |
2878 const char* l2 = NULL; | |
2879 | |
2880 if(!isLocaleAvailable(resIndex, newLoc)){ | |
2881 continue; | |
2882 } | |
2883 df1 = udat_open(UDAT_FULL, UDAT_FULL,oldLoc, NULL, 0, NULL, -1, &status)
; | |
2884 df2 = udat_open(UDAT_FULL, UDAT_FULL,newLoc, NULL, 0, NULL, -1, &status)
; | |
2885 if(U_FAILURE(status)){ | |
2886 log_err("Creation of date format failed %s\n", u_errorName(status))
; | |
2887 return; | |
2888 } | |
2889 /*Test function "getLocale"*/ | |
2890 l1 = udat_getLocaleByType(df1, ULOC_VALID_LOCALE, &status); | |
2891 l2 = udat_getLocaleByType(df2, ULOC_VALID_LOCALE, &status); | |
2892 if(U_FAILURE(status)){ | |
2893 log_err("Fetching the locale by type failed. %s\n", u_errorName(sta
tus)); | |
2894 } | |
2895 if (strcmp(newLoc,l1)!=0 || strcmp(l1,l2)!=0) { | |
2896 log_err("The locales are not equal!.Old: %s, New: %s \n", oldLoc, ne
wLoc); | |
2897 } | |
2898 log_verbose("udat_getLocaleByType old:%s new:%s\n", l1, l2); | |
2899 udat_close(df1); | |
2900 udat_close(df2); | |
2901 } | |
2902 ures_close(resIndex); | |
2903 #endif | |
2904 } | |
2905 | |
2906 static void TestCollation() { | |
2907 #if !UCONFIG_NO_COLLATION | |
2908 int i; | |
2909 UErrorCode status = U_ZERO_ERROR; | |
2910 UResourceBundle *resIndex = ures_open(NULL,"res_index", &status); | |
2911 if(U_FAILURE(status)){ | |
2912 log_err_status(status, "Could not open res_index.res. Exiting. Error: %s
\n", u_errorName(status)); | |
2913 return; | |
2914 } | |
2915 for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) { | |
2916 const char* oldLoc = LOCALE_ALIAS[i][0]; | |
2917 const char* newLoc = LOCALE_ALIAS[i][1]; | |
2918 UCollator* c1 = NULL; | |
2919 UCollator* c2 = NULL; | |
2920 const char* l1 = NULL; | |
2921 const char* l2 = NULL; | |
2922 | |
2923 status = U_ZERO_ERROR; | |
2924 if(!isLocaleAvailable(resIndex, newLoc)){ | |
2925 continue; | |
2926 } | |
2927 if(U_FAILURE(status)){ | |
2928 log_err("Creation of collators failed %s\n", u_errorName(status)); | |
2929 return; | |
2930 } | |
2931 c1 = ucol_open(oldLoc, &status); | |
2932 c2 = ucol_open(newLoc, &status); | |
2933 l1 = ucol_getLocaleByType(c1, ULOC_VALID_LOCALE, &status); | |
2934 l2 = ucol_getLocaleByType(c2, ULOC_VALID_LOCALE, &status); | |
2935 if(U_FAILURE(status)){ | |
2936 log_err("Fetching the locale names failed failed %s\n", u_errorName
(status)); | |
2937 } | |
2938 if (strcmp(newLoc,l1)!=0 || strcmp(l1,l2)!=0) { | |
2939 log_err("The locales are not equal!.Old: %s, New: %s \n", oldLoc, ne
wLoc); | |
2940 } | |
2941 log_verbose("ucol_getLocaleByType old:%s new:%s\n", l1, l2); | |
2942 ucol_close(c1); | |
2943 ucol_close(c2); | |
2944 } | |
2945 ures_close(resIndex); | |
2946 #endif | |
2947 } | |
2948 | |
2949 typedef struct OrientationStructTag { | |
2950 const char* localeId; | |
2951 ULayoutType character; | |
2952 ULayoutType line; | |
2953 } OrientationStruct; | |
2954 | |
2955 static const char* ULayoutTypeToString(ULayoutType type) | |
2956 { | |
2957 switch(type) | |
2958 { | |
2959 case ULOC_LAYOUT_LTR: | |
2960 return "ULOC_LAYOUT_LTR"; | |
2961 break; | |
2962 case ULOC_LAYOUT_RTL: | |
2963 return "ULOC_LAYOUT_RTL"; | |
2964 break; | |
2965 case ULOC_LAYOUT_TTB: | |
2966 return "ULOC_LAYOUT_TTB"; | |
2967 break; | |
2968 case ULOC_LAYOUT_BTT: | |
2969 return "ULOC_LAYOUT_BTT"; | |
2970 break; | |
2971 case ULOC_LAYOUT_UNKNOWN: | |
2972 break; | |
2973 } | |
2974 | |
2975 return "Unknown enum value for ULayoutType!"; | |
2976 } | |
2977 | |
2978 static void TestOrientation() | |
2979 { | |
2980 static const OrientationStruct toTest [] = { | |
2981 { "ar", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, | |
2982 { "aR", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, | |
2983 { "ar_Arab", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, | |
2984 { "fa", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, | |
2985 { "Fa", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, | |
2986 { "he", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, | |
2987 { "ps", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, | |
2988 { "ur", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, | |
2989 { "UR", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, | |
2990 { "en", ULOC_LAYOUT_LTR, ULOC_LAYOUT_TTB } | |
2991 }; | |
2992 | |
2993 size_t i = 0; | |
2994 for (; i < sizeof(toTest) / sizeof(toTest[0]); ++i) { | |
2995 UErrorCode statusCO = U_ZERO_ERROR; | |
2996 UErrorCode statusLO = U_ZERO_ERROR; | |
2997 const char* const localeId = toTest[i].localeId; | |
2998 const ULayoutType co = uloc_getCharacterOrientation(localeId, &statusCO)
; | |
2999 const ULayoutType expectedCO = toTest[i].character; | |
3000 const ULayoutType lo = uloc_getLineOrientation(localeId, &statusLO); | |
3001 const ULayoutType expectedLO = toTest[i].line; | |
3002 if (U_FAILURE(statusCO)) { | |
3003 log_err_status(statusCO, | |
3004 " unexpected failure for uloc_getCharacterOrientation(), with l
ocalId \"%s\" and status %s\n", | |
3005 localeId, | |
3006 u_errorName(statusCO)); | |
3007 } | |
3008 else if (co != expectedCO) { | |
3009 log_err( | |
3010 " unexpected result for uloc_getCharacterOrientation(), with lo
caleId \"%s\". Expected %s but got result %s\n", | |
3011 localeId, | |
3012 ULayoutTypeToString(expectedCO), | |
3013 ULayoutTypeToString(co)); | |
3014 } | |
3015 if (U_FAILURE(statusLO)) { | |
3016 log_err_status(statusLO, | |
3017 " unexpected failure for uloc_getLineOrientation(), with localI
d \"%s\" and status %s\n", | |
3018 localeId, | |
3019 u_errorName(statusLO)); | |
3020 } | |
3021 else if (lo != expectedLO) { | |
3022 log_err( | |
3023 " unexpected result for uloc_getLineOrientation(), with localeI
d \"%s\". Expected %s but got result %s\n", | |
3024 localeId, | |
3025 ULayoutTypeToString(expectedLO), | |
3026 ULayoutTypeToString(lo)); | |
3027 } | |
3028 } | |
3029 } | |
3030 | |
3031 static void TestULocale() { | |
3032 int i; | |
3033 UErrorCode status = U_ZERO_ERROR; | |
3034 UResourceBundle *resIndex = ures_open(NULL,"res_index", &status); | |
3035 if(U_FAILURE(status)){ | |
3036 log_err_status(status, "Could not open res_index.res. Exiting. Error: %s
\n", u_errorName(status)); | |
3037 return; | |
3038 } | |
3039 for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) { | |
3040 const char* oldLoc = LOCALE_ALIAS[i][0]; | |
3041 const char* newLoc = LOCALE_ALIAS[i][1]; | |
3042 UChar name1[256], name2[256]; | |
3043 char names1[256], names2[256]; | |
3044 int32_t capacity = 256; | |
3045 | |
3046 status = U_ZERO_ERROR; | |
3047 if(!isLocaleAvailable(resIndex, newLoc)){ | |
3048 continue; | |
3049 } | |
3050 uloc_getDisplayName(oldLoc, ULOC_US, name1, capacity, &status); | |
3051 if(U_FAILURE(status)){ | |
3052 log_err("uloc_getDisplayName(%s) failed %s\n", oldLoc, u_errorName(s
tatus)); | |
3053 } | |
3054 | |
3055 uloc_getDisplayName(newLoc, ULOC_US, name2, capacity, &status); | |
3056 if(U_FAILURE(status)){ | |
3057 log_err("uloc_getDisplayName(%s) failed %s\n", newLoc, u_errorName(s
tatus)); | |
3058 } | |
3059 | |
3060 if (u_strcmp(name1, name2)!=0) { | |
3061 log_err("The locales are not equal!.Old: %s, New: %s \n", oldLoc, ne
wLoc); | |
3062 } | |
3063 u_austrcpy(names1, name1); | |
3064 u_austrcpy(names2, name2); | |
3065 log_verbose("uloc_getDisplayName old:%s new:%s\n", names1, names2); | |
3066 } | |
3067 ures_close(resIndex); | |
3068 | |
3069 } | |
3070 | |
3071 static void TestUResourceBundle() { | |
3072 const char* us1; | |
3073 const char* us2; | |
3074 | |
3075 UResourceBundle* rb1 = NULL; | |
3076 UResourceBundle* rb2 = NULL; | |
3077 UErrorCode status = U_ZERO_ERROR; | |
3078 int i; | |
3079 UResourceBundle *resIndex = NULL; | |
3080 if(U_FAILURE(status)){ | |
3081 log_err("Could not open res_index.res. Exiting. Error: %s\n", u_errorNam
e(status)); | |
3082 return; | |
3083 } | |
3084 resIndex = ures_open(NULL,"res_index", &status); | |
3085 for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) { | |
3086 | |
3087 const char* oldLoc = LOCALE_ALIAS[i][0]; | |
3088 const char* newLoc = LOCALE_ALIAS[i][1]; | |
3089 if(!isLocaleAvailable(resIndex, newLoc)){ | |
3090 continue; | |
3091 } | |
3092 rb1 = ures_open(NULL, oldLoc, &status); | |
3093 if (U_FAILURE(status)) { | |
3094 log_err("ures_open(%s) failed %s\n", oldLoc, u_errorName(status)); | |
3095 } | |
3096 | |
3097 us1 = ures_getLocaleByType(rb1, ULOC_ACTUAL_LOCALE, &status); | |
3098 | |
3099 status = U_ZERO_ERROR; | |
3100 rb2 = ures_open(NULL, newLoc, &status); | |
3101 if (U_FAILURE(status)) { | |
3102 log_err("ures_open(%s) failed %s\n", oldLoc, u_errorName(status)); | |
3103 } | |
3104 us2 = ures_getLocaleByType(rb2, ULOC_ACTUAL_LOCALE, &status); | |
3105 | |
3106 if (strcmp(us1,newLoc)!=0 || strcmp(us1,us2)!=0 ) { | |
3107 log_err("The locales are not equal!.Old: %s, New: %s \n", oldLoc, ne
wLoc); | |
3108 } | |
3109 | |
3110 log_verbose("ures_getStringByKey old:%s new:%s\n", us1, us2); | |
3111 ures_close(rb1); | |
3112 rb1 = NULL; | |
3113 ures_close(rb2); | |
3114 rb2 = NULL; | |
3115 } | |
3116 ures_close(resIndex); | |
3117 } | |
3118 | |
3119 static void TestDisplayName() { | |
3120 | |
3121 UChar oldCountry[256] = {'\0'}; | |
3122 UChar newCountry[256] = {'\0'}; | |
3123 UChar oldLang[256] = {'\0'}; | |
3124 UChar newLang[256] = {'\0'}; | |
3125 char country[256] ={'\0'}; | |
3126 char language[256] ={'\0'}; | |
3127 int32_t capacity = 256; | |
3128 int i =0; | |
3129 int j=0; | |
3130 for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) { | |
3131 const char* oldLoc = LOCALE_ALIAS[i][0]; | |
3132 const char* newLoc = LOCALE_ALIAS[i][1]; | |
3133 UErrorCode status = U_ZERO_ERROR; | |
3134 int32_t available = uloc_countAvailable(); | |
3135 | |
3136 for(j=0; j<available; j++){ | |
3137 | |
3138 const char* dispLoc = uloc_getAvailable(j); | |
3139 int32_t oldCountryLen = uloc_getDisplayCountry(oldLoc,dispLoc, oldCo
untry, capacity, &status); | |
3140 int32_t newCountryLen = uloc_getDisplayCountry(newLoc, dispLoc, newC
ountry, capacity, &status); | |
3141 int32_t oldLangLen = uloc_getDisplayLanguage(oldLoc, dispLoc, oldLan
g, capacity, &status); | |
3142 int32_t newLangLen = uloc_getDisplayLanguage(newLoc, dispLoc, newLan
g, capacity, &status ); | |
3143 | |
3144 int32_t countryLen = uloc_getCountry(newLoc, country, capacity, &sta
tus); | |
3145 int32_t langLen = uloc_getLanguage(newLoc, language, capacity, &sta
tus); | |
3146 /* there is a display name for the current country ID */ | |
3147 if(countryLen != newCountryLen ){ | |
3148 if(u_strncmp(oldCountry,newCountry,oldCountryLen)!=0){ | |
3149 log_err("uloc_getDisplayCountry() failed for %s in display l
ocale %s \n", oldLoc, dispLoc); | |
3150 } | |
3151 } | |
3152 /* there is a display name for the current lang ID */ | |
3153 if(langLen!=newLangLen){ | |
3154 if(u_strncmp(oldLang,newLang,oldLangLen)){ | |
3155 log_err("uloc_getDisplayLanguage() failed for %s in display
locale %s \n", oldLoc, dispLoc); } | |
3156 } | |
3157 } | |
3158 } | |
3159 } | |
3160 | |
3161 static void TestGetLocaleForLCID() { | |
3162 int32_t i, length, lengthPre; | |
3163 const char* testLocale = 0; | |
3164 UErrorCode status = U_ZERO_ERROR; | |
3165 char temp2[40], temp3[40]; | |
3166 uint32_t lcid; | |
3167 | |
3168 lcid = uloc_getLCID("en_US"); | |
3169 if (lcid != 0x0409) { | |
3170 log_err(" uloc_getLCID(\"en_US\") = %d, expected 0x0409\n", lcid); | |
3171 } | |
3172 | |
3173 lengthPre = uloc_getLocaleForLCID(lcid, temp2, 4, &status); | |
3174 if (status != U_BUFFER_OVERFLOW_ERROR) { | |
3175 log_err(" unexpected result from uloc_getLocaleForLCID with small buffe
r: %s\n", u_errorName(status)); | |
3176 } | |
3177 else { | |
3178 status = U_ZERO_ERROR; | |
3179 } | |
3180 | |
3181 length = uloc_getLocaleForLCID(lcid, temp2, sizeof(temp2)/sizeof(char), &sta
tus); | |
3182 if (U_FAILURE(status)) { | |
3183 log_err(" unexpected result from uloc_getLocaleForLCID(0x0409): %s\n",
u_errorName(status)); | |
3184 status = U_ZERO_ERROR; | |
3185 } | |
3186 | |
3187 if (length != lengthPre) { | |
3188 log_err(" uloc_getLocaleForLCID(0x0409): returned length %d does not ma
tch preflight length %d\n", length, lengthPre); | |
3189 } | |
3190 | |
3191 length = uloc_getLocaleForLCID(0x12345, temp2, sizeof(temp2)/sizeof(char), &
status); | |
3192 if (U_SUCCESS(status)) { | |
3193 log_err(" unexpected result from uloc_getLocaleForLCID(0x12345): %s, st
atus %s\n", temp2, u_errorName(status)); | |
3194 } | |
3195 status = U_ZERO_ERROR; | |
3196 | |
3197 log_verbose("Testing getLocaleForLCID vs. locale data\n"); | |
3198 for (i = 0; i < LOCALE_SIZE; i++) { | |
3199 | |
3200 testLocale=rawData2[NAME][i]; | |
3201 | |
3202 log_verbose("Testing %s ......\n", testLocale); | |
3203 | |
3204 sscanf(rawData2[LCID][i], "%x", &lcid); | |
3205 length = uloc_getLocaleForLCID(lcid, temp2, sizeof(temp2)/sizeof(char),
&status); | |
3206 if (U_FAILURE(status)) { | |
3207 log_err(" unexpected failure of uloc_getLocaleForLCID(%#04x), statu
s %s\n", lcid, u_errorName(status)); | |
3208 status = U_ZERO_ERROR; | |
3209 continue; | |
3210 } | |
3211 | |
3212 if (length != uprv_strlen(temp2)) { | |
3213 log_err(" returned length %d not correct for uloc_getLocaleForLCID(
%#04x), expected %d\n", length, lcid, uprv_strlen(temp2)); | |
3214 } | |
3215 | |
3216 /* Compare language, country, script */ | |
3217 length = uloc_getLanguage(temp2, temp3, sizeof(temp3)/sizeof(char), &sta
tus); | |
3218 if (U_FAILURE(status)) { | |
3219 log_err(" couldn't get language in uloc_getLocaleForLCID(%#04x) = %
s, status %s\n", lcid, temp2, u_errorName(status)); | |
3220 status = U_ZERO_ERROR; | |
3221 } | |
3222 else if (uprv_strcmp(temp3, rawData2[LANG][i]) && !(uprv_strcmp(temp3, "
nn") == 0 && uprv_strcmp(rawData2[VAR][i], "NY") == 0)) { | |
3223 log_err(" language doesn't match expected %s in in uloc_getLocaleFo
rLCID(%#04x) = %s\n", rawData2[LANG][i], lcid, temp2); | |
3224 } | |
3225 | |
3226 length = uloc_getScript(temp2, temp3, sizeof(temp3)/sizeof(char), &statu
s); | |
3227 if (U_FAILURE(status)) { | |
3228 log_err(" couldn't get script in uloc_getLocaleForLCID(%#04x) = %s,
status %s\n", lcid, temp2, u_errorName(status)); | |
3229 status = U_ZERO_ERROR; | |
3230 } | |
3231 else if (uprv_strcmp(temp3, rawData2[SCRIPT][i])) { | |
3232 log_err(" script doesn't match expected %s in in uloc_getLocaleForL
CID(%#04x) = %s\n", rawData2[SCRIPT][i], lcid, temp2); | |
3233 } | |
3234 | |
3235 length = uloc_getCountry(temp2, temp3, sizeof(temp3)/sizeof(char), &stat
us); | |
3236 if (U_FAILURE(status)) { | |
3237 log_err(" couldn't get country in uloc_getLocaleForLCID(%#04x) = %s
, status %s\n", lcid, temp2, u_errorName(status)); | |
3238 status = U_ZERO_ERROR; | |
3239 } | |
3240 else if (uprv_strlen(rawData2[CTRY][i]) && uprv_strcmp(temp3, rawData2[C
TRY][i])) { | |
3241 log_err(" country doesn't match expected %s in in uloc_getLocaleFor
LCID(%#04x) = %s\n", rawData2[CTRY][i], lcid, temp2); | |
3242 } | |
3243 } | |
3244 | |
3245 } | |
3246 | |
3247 const char* const basic_maximize_data[][2] = { | |
3248 { | |
3249 "zu_Zzzz_Zz", | |
3250 "zu_Latn_ZA", | |
3251 }, { | |
3252 "ZU_Zz", | |
3253 "zu_Latn_ZA" | |
3254 }, { | |
3255 "zu_LATN", | |
3256 "zu_Latn_ZA" | |
3257 }, { | |
3258 "en_Zz", | |
3259 "en_Latn_US" | |
3260 }, { | |
3261 "en_us", | |
3262 "en_Latn_US" | |
3263 }, { | |
3264 "en_Kore", | |
3265 "en_Kore_US" | |
3266 }, { | |
3267 "en_Kore_Zz", | |
3268 "en_Kore_US" | |
3269 }, { | |
3270 "en_Kore_ZA", | |
3271 "en_Kore_ZA" | |
3272 }, { | |
3273 "en_Kore_ZA_POSIX", | |
3274 "en_Kore_ZA_POSIX" | |
3275 }, { | |
3276 "en_Gujr", | |
3277 "en_Gujr_US" | |
3278 }, { | |
3279 "en_ZA", | |
3280 "en_Latn_ZA" | |
3281 }, { | |
3282 "en_Gujr_Zz", | |
3283 "en_Gujr_US" | |
3284 }, { | |
3285 "en_Gujr_ZA", | |
3286 "en_Gujr_ZA" | |
3287 }, { | |
3288 "en_Gujr_ZA_POSIX", | |
3289 "en_Gujr_ZA_POSIX" | |
3290 }, { | |
3291 "en_US_POSIX_1901", | |
3292 "en_Latn_US_POSIX_1901" | |
3293 }, { | |
3294 "en_Latn__POSIX_1901", | |
3295 "en_Latn_US_POSIX_1901" | |
3296 }, { | |
3297 "en__POSIX_1901", | |
3298 "en_Latn_US_POSIX_1901" | |
3299 }, { | |
3300 "de__POSIX_1901", | |
3301 "de_Latn_DE_POSIX_1901" | |
3302 }, { | |
3303 "en_US_BOSTON", | |
3304 "en_Latn_US_BOSTON" | |
3305 }, { | |
3306 "th@calendar=buddhist", | |
3307 "th_Thai_TH@calendar=buddhist" | |
3308 }, { | |
3309 "ar_ZZ", | |
3310 "ar_Arab_EG" | |
3311 }, { | |
3312 "zh", | |
3313 "zh_Hans_CN" | |
3314 }, { | |
3315 "zh_TW", | |
3316 "zh_Hant_TW" | |
3317 }, { | |
3318 "zh_HK", | |
3319 "zh_Hant_HK" | |
3320 }, { | |
3321 "zh_Hant", | |
3322 "zh_Hant_TW" | |
3323 }, { | |
3324 "zh_Zzzz_CN", | |
3325 "zh_Hans_CN" | |
3326 }, { | |
3327 "und_US", | |
3328 "en_Latn_US" | |
3329 }, { | |
3330 "und_HK", | |
3331 "zh_Hant_HK" | |
3332 }, { | |
3333 "zzz", | |
3334 "" | |
3335 }, { | |
3336 "de_u_co_phonebk", | |
3337 "de_Latn_DE_U_CO_PHONEBK" | |
3338 }, { | |
3339 "de_Latn_u_co_phonebk", | |
3340 "de_Latn_DE_U_CO_PHONEBK" | |
3341 }, { | |
3342 "de_Latn_DE_u_co_phonebk", | |
3343 "de_Latn_DE_U_CO_PHONEBK" | |
3344 } | |
3345 }; | |
3346 | |
3347 const char* const basic_minimize_data[][2] = { | |
3348 { | |
3349 "en_Latn_US", | |
3350 "en" | |
3351 }, { | |
3352 "en_Latn_US_POSIX_1901", | |
3353 "en__POSIX_1901" | |
3354 }, { | |
3355 "EN_Latn_US_POSIX_1901", | |
3356 "en__POSIX_1901" | |
3357 }, { | |
3358 "en_Zzzz_US_POSIX_1901", | |
3359 "en__POSIX_1901" | |
3360 }, { | |
3361 "de_Latn_DE_POSIX_1901", | |
3362 "de__POSIX_1901" | |
3363 }, { | |
3364 "und", | |
3365 "" | |
3366 }, { | |
3367 "en_Latn_US@calendar=gregorian", | |
3368 "en@calendar=gregorian" | |
3369 } | |
3370 }; | |
3371 | |
3372 const char* const full_data[][3] = { | |
3373 { | |
3374 /* "FROM", */ | |
3375 /* "ADD-LIKELY", */ | |
3376 /* "REMOVE-LIKELY" */ | |
3377 /* }, { */ | |
3378 "aa", | |
3379 "aa_Latn_ET", | |
3380 "aa" | |
3381 }, { | |
3382 "af", | |
3383 "af_Latn_ZA", | |
3384 "af" | |
3385 }, { | |
3386 "ak", | |
3387 "ak_Latn_GH", | |
3388 "ak" | |
3389 }, { | |
3390 "am", | |
3391 "am_Ethi_ET", | |
3392 "am" | |
3393 }, { | |
3394 "ar", | |
3395 "ar_Arab_EG", | |
3396 "ar" | |
3397 }, { | |
3398 "as", | |
3399 "as_Beng_IN", | |
3400 "as" | |
3401 }, { | |
3402 "az", | |
3403 "az_Latn_AZ", | |
3404 "az" | |
3405 }, { | |
3406 "be", | |
3407 "be_Cyrl_BY", | |
3408 "be" | |
3409 }, { | |
3410 "bg", | |
3411 "bg_Cyrl_BG", | |
3412 "bg" | |
3413 }, { | |
3414 "bn", | |
3415 "bn_Beng_BD", | |
3416 "bn" | |
3417 }, { | |
3418 "bo", | |
3419 "bo_Tibt_CN", | |
3420 "bo" | |
3421 }, { | |
3422 "bs", | |
3423 "bs_Latn_BA", | |
3424 "bs" | |
3425 }, { | |
3426 "ca", | |
3427 "ca_Latn_ES", | |
3428 "ca" | |
3429 }, { | |
3430 "ch", | |
3431 "ch_Latn_GU", | |
3432 "ch" | |
3433 }, { | |
3434 "chk", | |
3435 "chk_Latn_FM", | |
3436 "chk" | |
3437 }, { | |
3438 "cs", | |
3439 "cs_Latn_CZ", | |
3440 "cs" | |
3441 }, { | |
3442 "cy", | |
3443 "cy_Latn_GB", | |
3444 "cy" | |
3445 }, { | |
3446 "da", | |
3447 "da_Latn_DK", | |
3448 "da" | |
3449 }, { | |
3450 "de", | |
3451 "de_Latn_DE", | |
3452 "de" | |
3453 }, { | |
3454 "dv", | |
3455 "dv_Thaa_MV", | |
3456 "dv" | |
3457 }, { | |
3458 "dz", | |
3459 "dz_Tibt_BT", | |
3460 "dz" | |
3461 }, { | |
3462 "ee", | |
3463 "ee_Latn_GH", | |
3464 "ee" | |
3465 }, { | |
3466 "el", | |
3467 "el_Grek_GR", | |
3468 "el" | |
3469 }, { | |
3470 "en", | |
3471 "en_Latn_US", | |
3472 "en" | |
3473 }, { | |
3474 "es", | |
3475 "es_Latn_ES", | |
3476 "es" | |
3477 }, { | |
3478 "et", | |
3479 "et_Latn_EE", | |
3480 "et" | |
3481 }, { | |
3482 "eu", | |
3483 "eu_Latn_ES", | |
3484 "eu" | |
3485 }, { | |
3486 "fa", | |
3487 "fa_Arab_IR", | |
3488 "fa" | |
3489 }, { | |
3490 "fi", | |
3491 "fi_Latn_FI", | |
3492 "fi" | |
3493 }, { | |
3494 "fil", | |
3495 "fil_Latn_PH", | |
3496 "fil" | |
3497 }, { | |
3498 "fo", | |
3499 "fo_Latn_FO", | |
3500 "fo" | |
3501 }, { | |
3502 "fr", | |
3503 "fr_Latn_FR", | |
3504 "fr" | |
3505 }, { | |
3506 "fur", | |
3507 "fur_Latn_IT", | |
3508 "fur" | |
3509 }, { | |
3510 "ga", | |
3511 "ga_Latn_IE", | |
3512 "ga" | |
3513 }, { | |
3514 "gaa", | |
3515 "gaa_Latn_GH", | |
3516 "gaa" | |
3517 }, { | |
3518 "gl", | |
3519 "gl_Latn_ES", | |
3520 "gl" | |
3521 }, { | |
3522 "gn", | |
3523 "gn_Latn_PY", | |
3524 "gn" | |
3525 }, { | |
3526 "gu", | |
3527 "gu_Gujr_IN", | |
3528 "gu" | |
3529 }, { | |
3530 "ha", | |
3531 "ha_Latn_NG", | |
3532 "ha" | |
3533 }, { | |
3534 "haw", | |
3535 "haw_Latn_US", | |
3536 "haw" | |
3537 }, { | |
3538 "he", | |
3539 "he_Hebr_IL", | |
3540 "he" | |
3541 }, { | |
3542 "hi", | |
3543 "hi_Deva_IN", | |
3544 "hi" | |
3545 }, { | |
3546 "hr", | |
3547 "hr_Latn_HR", | |
3548 "hr" | |
3549 }, { | |
3550 "ht", | |
3551 "ht_Latn_HT", | |
3552 "ht" | |
3553 }, { | |
3554 "hu", | |
3555 "hu_Latn_HU", | |
3556 "hu" | |
3557 }, { | |
3558 "hy", | |
3559 "hy_Armn_AM", | |
3560 "hy" | |
3561 }, { | |
3562 "id", | |
3563 "id_Latn_ID", | |
3564 "id" | |
3565 }, { | |
3566 "ig", | |
3567 "ig_Latn_NG", | |
3568 "ig" | |
3569 }, { | |
3570 "ii", | |
3571 "ii_Yiii_CN", | |
3572 "ii" | |
3573 }, { | |
3574 "is", | |
3575 "is_Latn_IS", | |
3576 "is" | |
3577 }, { | |
3578 "it", | |
3579 "it_Latn_IT", | |
3580 "it" | |
3581 }, { | |
3582 "ja", | |
3583 "ja_Jpan_JP", | |
3584 "ja" | |
3585 }, { | |
3586 "ka", | |
3587 "ka_Geor_GE", | |
3588 "ka" | |
3589 }, { | |
3590 "kaj", | |
3591 "kaj_Latn_NG", | |
3592 "kaj" | |
3593 }, { | |
3594 "kam", | |
3595 "kam_Latn_KE", | |
3596 "kam" | |
3597 }, { | |
3598 "kk", | |
3599 "kk_Cyrl_KZ", | |
3600 "kk" | |
3601 }, { | |
3602 "kl", | |
3603 "kl_Latn_GL", | |
3604 "kl" | |
3605 }, { | |
3606 "km", | |
3607 "km_Khmr_KH", | |
3608 "km" | |
3609 }, { | |
3610 "kn", | |
3611 "kn_Knda_IN", | |
3612 "kn" | |
3613 }, { | |
3614 "ko", | |
3615 "ko_Kore_KR", | |
3616 "ko" | |
3617 }, { | |
3618 "kok", | |
3619 "kok_Deva_IN", | |
3620 "kok" | |
3621 }, { | |
3622 "kpe", | |
3623 "kpe_Latn_LR", | |
3624 "kpe" | |
3625 }, { | |
3626 "ku", | |
3627 "ku_Latn_TR", | |
3628 "ku" | |
3629 }, { | |
3630 "ky", | |
3631 "ky_Cyrl_KG", | |
3632 "ky" | |
3633 }, { | |
3634 "la", | |
3635 "la_Latn_VA", | |
3636 "la" | |
3637 }, { | |
3638 "ln", | |
3639 "ln_Latn_CD", | |
3640 "ln" | |
3641 }, { | |
3642 "lo", | |
3643 "lo_Laoo_LA", | |
3644 "lo" | |
3645 }, { | |
3646 "lt", | |
3647 "lt_Latn_LT", | |
3648 "lt" | |
3649 }, { | |
3650 "lv", | |
3651 "lv_Latn_LV", | |
3652 "lv" | |
3653 }, { | |
3654 "mg", | |
3655 "mg_Latn_MG", | |
3656 "mg" | |
3657 }, { | |
3658 "mh", | |
3659 "mh_Latn_MH", | |
3660 "mh" | |
3661 }, { | |
3662 "mk", | |
3663 "mk_Cyrl_MK", | |
3664 "mk" | |
3665 }, { | |
3666 "ml", | |
3667 "ml_Mlym_IN", | |
3668 "ml" | |
3669 }, { | |
3670 "mn", | |
3671 "mn_Cyrl_MN", | |
3672 "mn" | |
3673 }, { | |
3674 "mr", | |
3675 "mr_Deva_IN", | |
3676 "mr" | |
3677 }, { | |
3678 "ms", | |
3679 "ms_Latn_MY", | |
3680 "ms" | |
3681 }, { | |
3682 "mt", | |
3683 "mt_Latn_MT", | |
3684 "mt" | |
3685 }, { | |
3686 "my", | |
3687 "my_Mymr_MM", | |
3688 "my" | |
3689 }, { | |
3690 "na", | |
3691 "na_Latn_NR", | |
3692 "na" | |
3693 }, { | |
3694 "ne", | |
3695 "ne_Deva_NP", | |
3696 "ne" | |
3697 }, { | |
3698 "niu", | |
3699 "niu_Latn_NU", | |
3700 "niu" | |
3701 }, { | |
3702 "nl", | |
3703 "nl_Latn_NL", | |
3704 "nl" | |
3705 }, { | |
3706 "nn", | |
3707 "nn_Latn_NO", | |
3708 "nn" | |
3709 }, { | |
3710 "nr", | |
3711 "nr_Latn_ZA", | |
3712 "nr" | |
3713 }, { | |
3714 "nso", | |
3715 "nso_Latn_ZA", | |
3716 "nso" | |
3717 }, { | |
3718 "ny", | |
3719 "ny_Latn_MW", | |
3720 "ny" | |
3721 }, { | |
3722 "om", | |
3723 "om_Latn_ET", | |
3724 "om" | |
3725 }, { | |
3726 "or", | |
3727 "or_Orya_IN", | |
3728 "or" | |
3729 }, { | |
3730 "pa", | |
3731 "pa_Guru_IN", | |
3732 "pa" | |
3733 }, { | |
3734 "pa_Arab", | |
3735 "pa_Arab_PK", | |
3736 "pa_PK" | |
3737 }, { | |
3738 "pa_PK", | |
3739 "pa_Arab_PK", | |
3740 "pa_PK" | |
3741 }, { | |
3742 "pap", | |
3743 "pap_Latn_AW", | |
3744 "pap" | |
3745 }, { | |
3746 "pau", | |
3747 "pau_Latn_PW", | |
3748 "pau" | |
3749 }, { | |
3750 "pl", | |
3751 "pl_Latn_PL", | |
3752 "pl" | |
3753 }, { | |
3754 "ps", | |
3755 "ps_Arab_AF", | |
3756 "ps" | |
3757 }, { | |
3758 "pt", | |
3759 "pt_Latn_BR", | |
3760 "pt" | |
3761 }, { | |
3762 "rn", | |
3763 "rn_Latn_BI", | |
3764 "rn" | |
3765 }, { | |
3766 "ro", | |
3767 "ro_Latn_RO", | |
3768 "ro" | |
3769 }, { | |
3770 "ru", | |
3771 "ru_Cyrl_RU", | |
3772 "ru" | |
3773 }, { | |
3774 "rw", | |
3775 "rw_Latn_RW", | |
3776 "rw" | |
3777 }, { | |
3778 "sa", | |
3779 "sa_Deva_IN", | |
3780 "sa" | |
3781 }, { | |
3782 "se", | |
3783 "se_Latn_NO", | |
3784 "se" | |
3785 }, { | |
3786 "sg", | |
3787 "sg_Latn_CF", | |
3788 "sg" | |
3789 }, { | |
3790 "si", | |
3791 "si_Sinh_LK", | |
3792 "si" | |
3793 }, { | |
3794 "sid", | |
3795 "sid_Latn_ET", | |
3796 "sid" | |
3797 }, { | |
3798 "sk", | |
3799 "sk_Latn_SK", | |
3800 "sk" | |
3801 }, { | |
3802 "sl", | |
3803 "sl_Latn_SI", | |
3804 "sl" | |
3805 }, { | |
3806 "sm", | |
3807 "sm_Latn_WS", | |
3808 "sm" | |
3809 }, { | |
3810 "so", | |
3811 "so_Latn_SO", | |
3812 "so" | |
3813 }, { | |
3814 "sq", | |
3815 "sq_Latn_AL", | |
3816 "sq" | |
3817 }, { | |
3818 "sr", | |
3819 "sr_Cyrl_RS", | |
3820 "sr" | |
3821 }, { | |
3822 "ss", | |
3823 "ss_Latn_ZA", | |
3824 "ss" | |
3825 }, { | |
3826 "st", | |
3827 "st_Latn_ZA", | |
3828 "st" | |
3829 }, { | |
3830 "sv", | |
3831 "sv_Latn_SE", | |
3832 "sv" | |
3833 }, { | |
3834 "sw", | |
3835 "sw_Latn_TZ", | |
3836 "sw" | |
3837 }, { | |
3838 "ta", | |
3839 "ta_Taml_IN", | |
3840 "ta" | |
3841 }, { | |
3842 "te", | |
3843 "te_Telu_IN", | |
3844 "te" | |
3845 }, { | |
3846 "tet", | |
3847 "tet_Latn_TL", | |
3848 "tet" | |
3849 }, { | |
3850 "tg", | |
3851 "tg_Cyrl_TJ", | |
3852 "tg" | |
3853 }, { | |
3854 "th", | |
3855 "th_Thai_TH", | |
3856 "th" | |
3857 }, { | |
3858 "ti", | |
3859 "ti_Ethi_ET", | |
3860 "ti" | |
3861 }, { | |
3862 "tig", | |
3863 "tig_Ethi_ER", | |
3864 "tig" | |
3865 }, { | |
3866 "tk", | |
3867 "tk_Latn_TM", | |
3868 "tk" | |
3869 }, { | |
3870 "tkl", | |
3871 "tkl_Latn_TK", | |
3872 "tkl" | |
3873 }, { | |
3874 "tn", | |
3875 "tn_Latn_ZA", | |
3876 "tn" | |
3877 }, { | |
3878 "to", | |
3879 "to_Latn_TO", | |
3880 "to" | |
3881 }, { | |
3882 "tpi", | |
3883 "tpi_Latn_PG", | |
3884 "tpi" | |
3885 }, { | |
3886 "tr", | |
3887 "tr_Latn_TR", | |
3888 "tr" | |
3889 }, { | |
3890 "ts", | |
3891 "ts_Latn_ZA", | |
3892 "ts" | |
3893 }, { | |
3894 "tt", | |
3895 "tt_Cyrl_RU", | |
3896 "tt" | |
3897 }, { | |
3898 "tvl", | |
3899 "tvl_Latn_TV", | |
3900 "tvl" | |
3901 }, { | |
3902 "ty", | |
3903 "ty_Latn_PF", | |
3904 "ty" | |
3905 }, { | |
3906 "uk", | |
3907 "uk_Cyrl_UA", | |
3908 "uk" | |
3909 }, { | |
3910 "und", | |
3911 "en_Latn_US", | |
3912 "en" | |
3913 }, { | |
3914 "und_AD", | |
3915 "ca_Latn_AD", | |
3916 "ca_AD" | |
3917 }, { | |
3918 "und_AE", | |
3919 "ar_Arab_AE", | |
3920 "ar_AE" | |
3921 }, { | |
3922 "und_AF", | |
3923 "fa_Arab_AF", | |
3924 "fa_AF" | |
3925 }, { | |
3926 "und_AL", | |
3927 "sq_Latn_AL", | |
3928 "sq" | |
3929 }, { | |
3930 "und_AM", | |
3931 "hy_Armn_AM", | |
3932 "hy" | |
3933 }, { | |
3934 "und_AO", | |
3935 "pt_Latn_AO", | |
3936 "pt_AO" | |
3937 }, { | |
3938 "und_AR", | |
3939 "es_Latn_AR", | |
3940 "es_AR" | |
3941 }, { | |
3942 "und_AS", | |
3943 "sm_Latn_AS", | |
3944 "sm_AS" | |
3945 }, { | |
3946 "und_AT", | |
3947 "de_Latn_AT", | |
3948 "de_AT" | |
3949 }, { | |
3950 "und_AW", | |
3951 "nl_Latn_AW", | |
3952 "nl_AW" | |
3953 }, { | |
3954 "und_AX", | |
3955 "sv_Latn_AX", | |
3956 "sv_AX" | |
3957 }, { | |
3958 "und_AZ", | |
3959 "az_Latn_AZ", | |
3960 "az" | |
3961 }, { | |
3962 "und_Arab", | |
3963 "ar_Arab_EG", | |
3964 "ar" | |
3965 }, { | |
3966 "und_Arab_IN", | |
3967 "ur_Arab_IN", | |
3968 "ur_IN" | |
3969 }, { | |
3970 "und_Arab_PK", | |
3971 "ur_Arab_PK", | |
3972 "ur" | |
3973 }, { | |
3974 "und_Arab_SN", | |
3975 "ar_Arab_SN", | |
3976 "ar_SN" | |
3977 }, { | |
3978 "und_Armn", | |
3979 "hy_Armn_AM", | |
3980 "hy" | |
3981 }, { | |
3982 "und_BA", | |
3983 "bs_Latn_BA", | |
3984 "bs" | |
3985 }, { | |
3986 "und_BD", | |
3987 "bn_Beng_BD", | |
3988 "bn" | |
3989 }, { | |
3990 "und_BE", | |
3991 "nl_Latn_BE", | |
3992 "nl_BE" | |
3993 }, { | |
3994 "und_BF", | |
3995 "fr_Latn_BF", | |
3996 "fr_BF" | |
3997 }, { | |
3998 "und_BG", | |
3999 "bg_Cyrl_BG", | |
4000 "bg" | |
4001 }, { | |
4002 "und_BH", | |
4003 "ar_Arab_BH", | |
4004 "ar_BH" | |
4005 }, { | |
4006 "und_BI", | |
4007 "rn_Latn_BI", | |
4008 "rn" | |
4009 }, { | |
4010 "und_BJ", | |
4011 "fr_Latn_BJ", | |
4012 "fr_BJ" | |
4013 }, { | |
4014 "und_BN", | |
4015 "ms_Latn_BN", | |
4016 "ms_BN" | |
4017 }, { | |
4018 "und_BO", | |
4019 "es_Latn_BO", | |
4020 "es_BO" | |
4021 }, { | |
4022 "und_BR", | |
4023 "pt_Latn_BR", | |
4024 "pt" | |
4025 }, { | |
4026 "und_BT", | |
4027 "dz_Tibt_BT", | |
4028 "dz" | |
4029 }, { | |
4030 "und_BY", | |
4031 "be_Cyrl_BY", | |
4032 "be" | |
4033 }, { | |
4034 "und_Beng", | |
4035 "bn_Beng_BD", | |
4036 "bn" | |
4037 }, { | |
4038 "und_Beng_IN", | |
4039 "bn_Beng_IN", | |
4040 "bn_IN" | |
4041 }, { | |
4042 "und_CD", | |
4043 "sw_Latn_CD", | |
4044 "sw_CD" | |
4045 }, { | |
4046 "und_CF", | |
4047 "fr_Latn_CF", | |
4048 "fr_CF" | |
4049 }, { | |
4050 "und_CG", | |
4051 "fr_Latn_CG", | |
4052 "fr_CG" | |
4053 }, { | |
4054 "und_CH", | |
4055 "de_Latn_CH", | |
4056 "de_CH" | |
4057 }, { | |
4058 "und_CI", | |
4059 "fr_Latn_CI", | |
4060 "fr_CI" | |
4061 }, { | |
4062 "und_CL", | |
4063 "es_Latn_CL", | |
4064 "es_CL" | |
4065 }, { | |
4066 "und_CM", | |
4067 "fr_Latn_CM", | |
4068 "fr_CM" | |
4069 }, { | |
4070 "und_CN", | |
4071 "zh_Hans_CN", | |
4072 "zh" | |
4073 }, { | |
4074 "und_CO", | |
4075 "es_Latn_CO", | |
4076 "es_CO" | |
4077 }, { | |
4078 "und_CR", | |
4079 "es_Latn_CR", | |
4080 "es_CR" | |
4081 }, { | |
4082 "und_CU", | |
4083 "es_Latn_CU", | |
4084 "es_CU" | |
4085 }, { | |
4086 "und_CV", | |
4087 "pt_Latn_CV", | |
4088 "pt_CV" | |
4089 }, { | |
4090 "und_CY", | |
4091 "el_Grek_CY", | |
4092 "el_CY" | |
4093 }, { | |
4094 "und_CZ", | |
4095 "cs_Latn_CZ", | |
4096 "cs" | |
4097 }, { | |
4098 "und_Cher", | |
4099 "chr_Cher_US", | |
4100 "chr" | |
4101 }, { | |
4102 "und_Cyrl", | |
4103 "ru_Cyrl_RU", | |
4104 "ru" | |
4105 }, { | |
4106 "und_Cyrl_KZ", | |
4107 "ru_Cyrl_KZ", | |
4108 "ru_KZ" | |
4109 }, { | |
4110 "und_DE", | |
4111 "de_Latn_DE", | |
4112 "de" | |
4113 }, { | |
4114 "und_DJ", | |
4115 "aa_Latn_DJ", | |
4116 "aa_DJ" | |
4117 }, { | |
4118 "und_DK", | |
4119 "da_Latn_DK", | |
4120 "da" | |
4121 }, { | |
4122 "und_DO", | |
4123 "es_Latn_DO", | |
4124 "es_DO" | |
4125 }, { | |
4126 "und_DZ", | |
4127 "ar_Arab_DZ", | |
4128 "ar_DZ" | |
4129 }, { | |
4130 "und_Deva", | |
4131 "hi_Deva_IN", | |
4132 "hi" | |
4133 }, { | |
4134 "und_EC", | |
4135 "es_Latn_EC", | |
4136 "es_EC" | |
4137 }, { | |
4138 "und_EE", | |
4139 "et_Latn_EE", | |
4140 "et" | |
4141 }, { | |
4142 "und_EG", | |
4143 "ar_Arab_EG", | |
4144 "ar" | |
4145 }, { | |
4146 "und_EH", | |
4147 "ar_Arab_EH", | |
4148 "ar_EH" | |
4149 }, { | |
4150 "und_ER", | |
4151 "ti_Ethi_ER", | |
4152 "ti_ER" | |
4153 }, { | |
4154 "und_ES", | |
4155 "es_Latn_ES", | |
4156 "es" | |
4157 }, { | |
4158 "und_ET", | |
4159 "am_Ethi_ET", | |
4160 "am" | |
4161 }, { | |
4162 "und_Ethi", | |
4163 "am_Ethi_ET", | |
4164 "am" | |
4165 }, { | |
4166 "und_Ethi_ER", | |
4167 "am_Ethi_ER", | |
4168 "am_ER" | |
4169 }, { | |
4170 "und_FI", | |
4171 "fi_Latn_FI", | |
4172 "fi" | |
4173 }, { | |
4174 "und_FM", | |
4175 "en_Latn_FM", | |
4176 "en_FM" | |
4177 }, { | |
4178 "und_FO", | |
4179 "fo_Latn_FO", | |
4180 "fo" | |
4181 }, { | |
4182 "und_FR", | |
4183 "fr_Latn_FR", | |
4184 "fr" | |
4185 }, { | |
4186 "und_GA", | |
4187 "fr_Latn_GA", | |
4188 "fr_GA" | |
4189 }, { | |
4190 "und_GE", | |
4191 "ka_Geor_GE", | |
4192 "ka" | |
4193 }, { | |
4194 "und_GF", | |
4195 "fr_Latn_GF", | |
4196 "fr_GF" | |
4197 }, { | |
4198 "und_GL", | |
4199 "kl_Latn_GL", | |
4200 "kl" | |
4201 }, { | |
4202 "und_GN", | |
4203 "fr_Latn_GN", | |
4204 "fr_GN" | |
4205 }, { | |
4206 "und_GP", | |
4207 "fr_Latn_GP", | |
4208 "fr_GP" | |
4209 }, { | |
4210 "und_GQ", | |
4211 "es_Latn_GQ", | |
4212 "es_GQ" | |
4213 }, { | |
4214 "und_GR", | |
4215 "el_Grek_GR", | |
4216 "el" | |
4217 }, { | |
4218 "und_GT", | |
4219 "es_Latn_GT", | |
4220 "es_GT" | |
4221 }, { | |
4222 "und_GU", | |
4223 "en_Latn_GU", | |
4224 "en_GU" | |
4225 }, { | |
4226 "und_GW", | |
4227 "pt_Latn_GW", | |
4228 "pt_GW" | |
4229 }, { | |
4230 "und_Geor", | |
4231 "ka_Geor_GE", | |
4232 "ka" | |
4233 }, { | |
4234 "und_Grek", | |
4235 "el_Grek_GR", | |
4236 "el" | |
4237 }, { | |
4238 "und_Gujr", | |
4239 "gu_Gujr_IN", | |
4240 "gu" | |
4241 }, { | |
4242 "und_Guru", | |
4243 "pa_Guru_IN", | |
4244 "pa" | |
4245 }, { | |
4246 "und_HK", | |
4247 "zh_Hant_HK", | |
4248 "zh_HK" | |
4249 }, { | |
4250 "und_HN", | |
4251 "es_Latn_HN", | |
4252 "es_HN" | |
4253 }, { | |
4254 "und_HR", | |
4255 "hr_Latn_HR", | |
4256 "hr" | |
4257 }, { | |
4258 "und_HT", | |
4259 "ht_Latn_HT", | |
4260 "ht" | |
4261 }, { | |
4262 "und_HU", | |
4263 "hu_Latn_HU", | |
4264 "hu" | |
4265 }, { | |
4266 "und_Hani", | |
4267 "zh_Hani_CN", | |
4268 "zh_Hani" | |
4269 }, { | |
4270 "und_Hans", | |
4271 "zh_Hans_CN", | |
4272 "zh" | |
4273 }, { | |
4274 "und_Hant", | |
4275 "zh_Hant_TW", | |
4276 "zh_TW" | |
4277 }, { | |
4278 "und_Hebr", | |
4279 "he_Hebr_IL", | |
4280 "he" | |
4281 }, { | |
4282 "und_IL", | |
4283 "he_Hebr_IL", | |
4284 "he" | |
4285 }, { | |
4286 "und_IN", | |
4287 "hi_Deva_IN", | |
4288 "hi" | |
4289 }, { | |
4290 "und_IQ", | |
4291 "ar_Arab_IQ", | |
4292 "ar_IQ" | |
4293 }, { | |
4294 "und_IR", | |
4295 "fa_Arab_IR", | |
4296 "fa" | |
4297 }, { | |
4298 "und_IS", | |
4299 "is_Latn_IS", | |
4300 "is" | |
4301 }, { | |
4302 "und_IT", | |
4303 "it_Latn_IT", | |
4304 "it" | |
4305 }, { | |
4306 "und_JO", | |
4307 "ar_Arab_JO", | |
4308 "ar_JO" | |
4309 }, { | |
4310 "und_JP", | |
4311 "ja_Jpan_JP", | |
4312 "ja" | |
4313 }, { | |
4314 "und_Jpan", | |
4315 "ja_Jpan_JP", | |
4316 "ja" | |
4317 }, { | |
4318 "und_KG", | |
4319 "ky_Cyrl_KG", | |
4320 "ky" | |
4321 }, { | |
4322 "und_KH", | |
4323 "km_Khmr_KH", | |
4324 "km" | |
4325 }, { | |
4326 "und_KM", | |
4327 "ar_Arab_KM", | |
4328 "ar_KM" | |
4329 }, { | |
4330 "und_KP", | |
4331 "ko_Kore_KP", | |
4332 "ko_KP" | |
4333 }, { | |
4334 "und_KR", | |
4335 "ko_Kore_KR", | |
4336 "ko" | |
4337 }, { | |
4338 "und_KW", | |
4339 "ar_Arab_KW", | |
4340 "ar_KW" | |
4341 }, { | |
4342 "und_KZ", | |
4343 "ru_Cyrl_KZ", | |
4344 "ru_KZ" | |
4345 }, { | |
4346 "und_Khmr", | |
4347 "km_Khmr_KH", | |
4348 "km" | |
4349 }, { | |
4350 "und_Knda", | |
4351 "kn_Knda_IN", | |
4352 "kn" | |
4353 }, { | |
4354 "und_Kore", | |
4355 "ko_Kore_KR", | |
4356 "ko" | |
4357 }, { | |
4358 "und_LA", | |
4359 "lo_Laoo_LA", | |
4360 "lo" | |
4361 }, { | |
4362 "und_LB", | |
4363 "ar_Arab_LB", | |
4364 "ar_LB" | |
4365 }, { | |
4366 "und_LI", | |
4367 "de_Latn_LI", | |
4368 "de_LI" | |
4369 }, { | |
4370 "und_LK", | |
4371 "si_Sinh_LK", | |
4372 "si" | |
4373 }, { | |
4374 "und_LS", | |
4375 "st_Latn_LS", | |
4376 "st_LS" | |
4377 }, { | |
4378 "und_LT", | |
4379 "lt_Latn_LT", | |
4380 "lt" | |
4381 }, { | |
4382 "und_LU", | |
4383 "fr_Latn_LU", | |
4384 "fr_LU" | |
4385 }, { | |
4386 "und_LV", | |
4387 "lv_Latn_LV", | |
4388 "lv" | |
4389 }, { | |
4390 "und_LY", | |
4391 "ar_Arab_LY", | |
4392 "ar_LY" | |
4393 }, { | |
4394 "und_Laoo", | |
4395 "lo_Laoo_LA", | |
4396 "lo" | |
4397 }, { | |
4398 "und_Latn_ES", | |
4399 "es_Latn_ES", | |
4400 "es" | |
4401 }, { | |
4402 "und_Latn_ET", | |
4403 "en_Latn_ET", | |
4404 "en_ET" | |
4405 }, { | |
4406 "und_Latn_GB", | |
4407 "en_Latn_GB", | |
4408 "en_GB" | |
4409 }, { | |
4410 "und_Latn_GH", | |
4411 "ak_Latn_GH", | |
4412 "ak" | |
4413 }, { | |
4414 "und_Latn_ID", | |
4415 "id_Latn_ID", | |
4416 "id" | |
4417 }, { | |
4418 "und_Latn_IT", | |
4419 "it_Latn_IT", | |
4420 "it" | |
4421 }, { | |
4422 "und_Latn_NG", | |
4423 "en_Latn_NG", | |
4424 "en_NG" | |
4425 }, { | |
4426 "und_Latn_TR", | |
4427 "tr_Latn_TR", | |
4428 "tr" | |
4429 }, { | |
4430 "und_Latn_ZA", | |
4431 "en_Latn_ZA", | |
4432 "en_ZA" | |
4433 }, { | |
4434 "und_MA", | |
4435 "ar_Arab_MA", | |
4436 "ar_MA" | |
4437 }, { | |
4438 "und_MC", | |
4439 "fr_Latn_MC", | |
4440 "fr_MC" | |
4441 }, { | |
4442 "und_MD", | |
4443 "ro_Latn_MD", | |
4444 "ro_MD" | |
4445 }, { | |
4446 "und_ME", | |
4447 "sr_Latn_ME", | |
4448 "sr_ME" | |
4449 }, { | |
4450 "und_MG", | |
4451 "mg_Latn_MG", | |
4452 "mg" | |
4453 }, { | |
4454 "und_MH", | |
4455 "en_Latn_MH", | |
4456 "en_MH" | |
4457 }, { | |
4458 "und_MK", | |
4459 "mk_Cyrl_MK", | |
4460 "mk" | |
4461 }, { | |
4462 "und_ML", | |
4463 "bm_Latn_ML", | |
4464 "bm" | |
4465 }, { | |
4466 "und_MM", | |
4467 "my_Mymr_MM", | |
4468 "my" | |
4469 }, { | |
4470 "und_MN", | |
4471 "mn_Cyrl_MN", | |
4472 "mn" | |
4473 }, { | |
4474 "und_MO", | |
4475 "zh_Hant_MO", | |
4476 "zh_MO" | |
4477 }, { | |
4478 "und_MQ", | |
4479 "fr_Latn_MQ", | |
4480 "fr_MQ" | |
4481 }, { | |
4482 "und_MR", | |
4483 "ar_Arab_MR", | |
4484 "ar_MR" | |
4485 }, { | |
4486 "und_MT", | |
4487 "mt_Latn_MT", | |
4488 "mt" | |
4489 }, { | |
4490 "und_MV", | |
4491 "dv_Thaa_MV", | |
4492 "dv" | |
4493 }, { | |
4494 "und_MW", | |
4495 "en_Latn_MW", | |
4496 "en_MW" | |
4497 }, { | |
4498 "und_MX", | |
4499 "es_Latn_MX", | |
4500 "es_MX" | |
4501 }, { | |
4502 "und_MY", | |
4503 "ms_Latn_MY", | |
4504 "ms" | |
4505 }, { | |
4506 "und_MZ", | |
4507 "pt_Latn_MZ", | |
4508 "pt_MZ" | |
4509 }, { | |
4510 "und_Mlym", | |
4511 "ml_Mlym_IN", | |
4512 "ml" | |
4513 }, { | |
4514 "und_Mymr", | |
4515 "my_Mymr_MM", | |
4516 "my" | |
4517 }, { | |
4518 "und_NC", | |
4519 "fr_Latn_NC", | |
4520 "fr_NC" | |
4521 }, { | |
4522 "und_NE", | |
4523 "ha_Latn_NE", | |
4524 "ha_NE" | |
4525 }, { | |
4526 "und_NG", | |
4527 "en_Latn_NG", | |
4528 "en_NG" | |
4529 }, { | |
4530 "und_NI", | |
4531 "es_Latn_NI", | |
4532 "es_NI" | |
4533 }, { | |
4534 "und_NL", | |
4535 "nl_Latn_NL", | |
4536 "nl" | |
4537 }, { | |
4538 "und_NO", | |
4539 "nb_Latn_NO", | |
4540 "nb" | |
4541 }, { | |
4542 "und_NP", | |
4543 "ne_Deva_NP", | |
4544 "ne" | |
4545 }, { | |
4546 "und_NR", | |
4547 "en_Latn_NR", | |
4548 "en_NR" | |
4549 }, { | |
4550 "und_NU", | |
4551 "en_Latn_NU", | |
4552 "en_NU" | |
4553 }, { | |
4554 "und_OM", | |
4555 "ar_Arab_OM", | |
4556 "ar_OM" | |
4557 }, { | |
4558 "und_Orya", | |
4559 "or_Orya_IN", | |
4560 "or" | |
4561 }, { | |
4562 "und_PA", | |
4563 "es_Latn_PA", | |
4564 "es_PA" | |
4565 }, { | |
4566 "und_PE", | |
4567 "es_Latn_PE", | |
4568 "es_PE" | |
4569 }, { | |
4570 "und_PF", | |
4571 "fr_Latn_PF", | |
4572 "fr_PF" | |
4573 }, { | |
4574 "und_PG", | |
4575 "tpi_Latn_PG", | |
4576 "tpi" | |
4577 }, { | |
4578 "und_PH", | |
4579 "fil_Latn_PH", | |
4580 "fil" | |
4581 }, { | |
4582 "und_PL", | |
4583 "pl_Latn_PL", | |
4584 "pl" | |
4585 }, { | |
4586 "und_PM", | |
4587 "fr_Latn_PM", | |
4588 "fr_PM" | |
4589 }, { | |
4590 "und_PR", | |
4591 "es_Latn_PR", | |
4592 "es_PR" | |
4593 }, { | |
4594 "und_PS", | |
4595 "ar_Arab_PS", | |
4596 "ar_PS" | |
4597 }, { | |
4598 "und_PT", | |
4599 "pt_Latn_PT", | |
4600 "pt_PT" | |
4601 }, { | |
4602 "und_PW", | |
4603 "pau_Latn_PW", | |
4604 "pau" | |
4605 }, { | |
4606 "und_PY", | |
4607 "gn_Latn_PY", | |
4608 "gn" | |
4609 }, { | |
4610 "und_QA", | |
4611 "ar_Arab_QA", | |
4612 "ar_QA" | |
4613 }, { | |
4614 "und_RE", | |
4615 "fr_Latn_RE", | |
4616 "fr_RE" | |
4617 }, { | |
4618 "und_RO", | |
4619 "ro_Latn_RO", | |
4620 "ro" | |
4621 }, { | |
4622 "und_RS", | |
4623 "sr_Cyrl_RS", | |
4624 "sr" | |
4625 }, { | |
4626 "und_RU", | |
4627 "ru_Cyrl_RU", | |
4628 "ru" | |
4629 }, { | |
4630 "und_RW", | |
4631 "rw_Latn_RW", | |
4632 "rw" | |
4633 }, { | |
4634 "und_SA", | |
4635 "ar_Arab_SA", | |
4636 "ar_SA" | |
4637 }, { | |
4638 "und_SD", | |
4639 "ar_Arab_SD", | |
4640 "ar_SD" | |
4641 }, { | |
4642 "und_SE", | |
4643 "sv_Latn_SE", | |
4644 "sv" | |
4645 }, { | |
4646 "und_SG", | |
4647 "en_Latn_SG", | |
4648 "en_SG" | |
4649 }, { | |
4650 "und_SI", | |
4651 "sl_Latn_SI", | |
4652 "sl" | |
4653 }, { | |
4654 "und_SJ", | |
4655 "nb_Latn_SJ", | |
4656 "nb_SJ" | |
4657 }, { | |
4658 "und_SK", | |
4659 "sk_Latn_SK", | |
4660 "sk" | |
4661 }, { | |
4662 "und_SM", | |
4663 "it_Latn_SM", | |
4664 "it_SM" | |
4665 }, { | |
4666 "und_SN", | |
4667 "fr_Latn_SN", | |
4668 "fr_SN" | |
4669 }, { | |
4670 "und_SO", | |
4671 "so_Latn_SO", | |
4672 "so" | |
4673 }, { | |
4674 "und_SR", | |
4675 "nl_Latn_SR", | |
4676 "nl_SR" | |
4677 }, { | |
4678 "und_ST", | |
4679 "pt_Latn_ST", | |
4680 "pt_ST" | |
4681 }, { | |
4682 "und_SV", | |
4683 "es_Latn_SV", | |
4684 "es_SV" | |
4685 }, { | |
4686 "und_SY", | |
4687 "ar_Arab_SY", | |
4688 "ar_SY" | |
4689 }, { | |
4690 "und_Sinh", | |
4691 "si_Sinh_LK", | |
4692 "si" | |
4693 }, { | |
4694 "und_TD", | |
4695 "fr_Latn_TD", | |
4696 "fr_TD" | |
4697 }, { | |
4698 "und_TG", | |
4699 "fr_Latn_TG", | |
4700 "fr_TG" | |
4701 }, { | |
4702 "und_TH", | |
4703 "th_Thai_TH", | |
4704 "th" | |
4705 }, { | |
4706 "und_TJ", | |
4707 "tg_Cyrl_TJ", | |
4708 "tg" | |
4709 }, { | |
4710 "und_TK", | |
4711 "tkl_Latn_TK", | |
4712 "tkl" | |
4713 }, { | |
4714 "und_TL", | |
4715 "pt_Latn_TL", | |
4716 "pt_TL" | |
4717 }, { | |
4718 "und_TM", | |
4719 "tk_Latn_TM", | |
4720 "tk" | |
4721 }, { | |
4722 "und_TN", | |
4723 "ar_Arab_TN", | |
4724 "ar_TN" | |
4725 }, { | |
4726 "und_TO", | |
4727 "to_Latn_TO", | |
4728 "to" | |
4729 }, { | |
4730 "und_TR", | |
4731 "tr_Latn_TR", | |
4732 "tr" | |
4733 }, { | |
4734 "und_TV", | |
4735 "tvl_Latn_TV", | |
4736 "tvl" | |
4737 }, { | |
4738 "und_TW", | |
4739 "zh_Hant_TW", | |
4740 "zh_TW" | |
4741 }, { | |
4742 "und_Taml", | |
4743 "ta_Taml_IN", | |
4744 "ta" | |
4745 }, { | |
4746 "und_Telu", | |
4747 "te_Telu_IN", | |
4748 "te" | |
4749 }, { | |
4750 "und_Thaa", | |
4751 "dv_Thaa_MV", | |
4752 "dv" | |
4753 }, { | |
4754 "und_Thai", | |
4755 "th_Thai_TH", | |
4756 "th" | |
4757 }, { | |
4758 "und_Tibt", | |
4759 "bo_Tibt_CN", | |
4760 "bo" | |
4761 }, { | |
4762 "und_UA", | |
4763 "uk_Cyrl_UA", | |
4764 "uk" | |
4765 }, { | |
4766 "und_UY", | |
4767 "es_Latn_UY", | |
4768 "es_UY" | |
4769 }, { | |
4770 "und_UZ", | |
4771 "uz_Latn_UZ", | |
4772 "uz" | |
4773 }, { | |
4774 "und_VA", | |
4775 "it_Latn_VA", | |
4776 "it_VA" | |
4777 }, { | |
4778 "und_VE", | |
4779 "es_Latn_VE", | |
4780 "es_VE" | |
4781 }, { | |
4782 "und_VN", | |
4783 "vi_Latn_VN", | |
4784 "vi" | |
4785 }, { | |
4786 "und_VU", | |
4787 "bi_Latn_VU", | |
4788 "bi" | |
4789 }, { | |
4790 "und_WF", | |
4791 "fr_Latn_WF", | |
4792 "fr_WF" | |
4793 }, { | |
4794 "und_WS", | |
4795 "sm_Latn_WS", | |
4796 "sm" | |
4797 }, { | |
4798 "und_YE", | |
4799 "ar_Arab_YE", | |
4800 "ar_YE" | |
4801 }, { | |
4802 "und_YT", | |
4803 "fr_Latn_YT", | |
4804 "fr_YT" | |
4805 }, { | |
4806 "und_Yiii", | |
4807 "ii_Yiii_CN", | |
4808 "ii" | |
4809 }, { | |
4810 "ur", | |
4811 "ur_Arab_PK", | |
4812 "ur" | |
4813 }, { | |
4814 "uz", | |
4815 "uz_Latn_UZ", | |
4816 "uz" | |
4817 }, { | |
4818 "uz_AF", | |
4819 "uz_Arab_AF", | |
4820 "uz_AF" | |
4821 }, { | |
4822 "uz_Arab", | |
4823 "uz_Arab_AF", | |
4824 "uz_AF" | |
4825 }, { | |
4826 "ve", | |
4827 "ve_Latn_ZA", | |
4828 "ve" | |
4829 }, { | |
4830 "vi", | |
4831 "vi_Latn_VN", | |
4832 "vi" | |
4833 }, { | |
4834 "wal", | |
4835 "wal_Ethi_ET", | |
4836 "wal" | |
4837 }, { | |
4838 "wo", | |
4839 "wo_Latn_SN", | |
4840 "wo" | |
4841 }, { | |
4842 "xh", | |
4843 "xh_Latn_ZA", | |
4844 "xh" | |
4845 }, { | |
4846 "yo", | |
4847 "yo_Latn_NG", | |
4848 "yo" | |
4849 }, { | |
4850 "zh", | |
4851 "zh_Hans_CN", | |
4852 "zh" | |
4853 }, { | |
4854 "zh_HK", | |
4855 "zh_Hant_HK", | |
4856 "zh_HK" | |
4857 }, { | |
4858 "zh_Hani", | |
4859 "zh_Hani_CN", /* changed due to cldrbug 6204, may be an error */ | |
4860 "zh_Hani", /* changed due to cldrbug 6204, may be an error */ | |
4861 }, { | |
4862 "zh_Hant", | |
4863 "zh_Hant_TW", | |
4864 "zh_TW" | |
4865 }, { | |
4866 "zh_MO", | |
4867 "zh_Hant_MO", | |
4868 "zh_MO" | |
4869 }, { | |
4870 "zh_TW", | |
4871 "zh_Hant_TW", | |
4872 "zh_TW" | |
4873 }, { | |
4874 "zu", | |
4875 "zu_Latn_ZA", | |
4876 "zu" | |
4877 }, { | |
4878 "und", | |
4879 "en_Latn_US", | |
4880 "en" | |
4881 }, { | |
4882 "und_ZZ", | |
4883 "en_Latn_US", | |
4884 "en" | |
4885 }, { | |
4886 "und_CN", | |
4887 "zh_Hans_CN", | |
4888 "zh" | |
4889 }, { | |
4890 "und_TW", | |
4891 "zh_Hant_TW", | |
4892 "zh_TW" | |
4893 }, { | |
4894 "und_HK", | |
4895 "zh_Hant_HK", | |
4896 "zh_HK" | |
4897 }, { | |
4898 "und_AQ", | |
4899 "und_Latn_AQ", | |
4900 "und_AQ" | |
4901 }, { | |
4902 "und_Zzzz", | |
4903 "en_Latn_US", | |
4904 "en" | |
4905 }, { | |
4906 "und_Zzzz_ZZ", | |
4907 "en_Latn_US", | |
4908 "en" | |
4909 }, { | |
4910 "und_Zzzz_CN", | |
4911 "zh_Hans_CN", | |
4912 "zh" | |
4913 }, { | |
4914 "und_Zzzz_TW", | |
4915 "zh_Hant_TW", | |
4916 "zh_TW" | |
4917 }, { | |
4918 "und_Zzzz_HK", | |
4919 "zh_Hant_HK", | |
4920 "zh_HK" | |
4921 }, { | |
4922 "und_Zzzz_AQ", | |
4923 "und_Latn_AQ", | |
4924 "und_AQ" | |
4925 }, { | |
4926 "und_Latn", | |
4927 "en_Latn_US", | |
4928 "en" | |
4929 }, { | |
4930 "und_Latn_ZZ", | |
4931 "en_Latn_US", | |
4932 "en" | |
4933 }, { | |
4934 "und_Latn_CN", | |
4935 "za_Latn_CN", | |
4936 "za" | |
4937 }, { | |
4938 "und_Latn_TW", | |
4939 "trv_Latn_TW", | |
4940 "trv" | |
4941 }, { | |
4942 "und_Latn_HK", | |
4943 "zh_Latn_HK", | |
4944 "zh_Latn_HK" | |
4945 }, { | |
4946 "und_Latn_AQ", | |
4947 "und_Latn_AQ", | |
4948 "und_AQ" | |
4949 }, { | |
4950 "und_Hans", | |
4951 "zh_Hans_CN", | |
4952 "zh" | |
4953 }, { | |
4954 "und_Hans_ZZ", | |
4955 "zh_Hans_CN", | |
4956 "zh" | |
4957 }, { | |
4958 "und_Hans_CN", | |
4959 "zh_Hans_CN", | |
4960 "zh" | |
4961 }, { | |
4962 "und_Hans_TW", | |
4963 "zh_Hans_TW", | |
4964 "zh_Hans_TW" | |
4965 }, { | |
4966 "und_Hans_HK", | |
4967 "zh_Hans_HK", | |
4968 "zh_Hans_HK" | |
4969 }, { | |
4970 "und_Hans_AQ", | |
4971 "zh_Hans_AQ", | |
4972 "zh_AQ" | |
4973 }, { | |
4974 "und_Hant", | |
4975 "zh_Hant_TW", | |
4976 "zh_TW" | |
4977 }, { | |
4978 "und_Hant_ZZ", | |
4979 "zh_Hant_TW", | |
4980 "zh_TW" | |
4981 }, { | |
4982 "und_Hant_CN", | |
4983 "zh_Hant_CN", | |
4984 "zh_Hant_CN" | |
4985 }, { | |
4986 "und_Hant_TW", | |
4987 "zh_Hant_TW", | |
4988 "zh_TW" | |
4989 }, { | |
4990 "und_Hant_HK", | |
4991 "zh_Hant_HK", | |
4992 "zh_HK" | |
4993 }, { | |
4994 "und_Hant_AQ", | |
4995 "zh_Hant_AQ", | |
4996 "zh_Hant_AQ" | |
4997 }, { | |
4998 "und_Moon", | |
4999 "en_Moon_US", | |
5000 "en_Moon" | |
5001 }, { | |
5002 "und_Moon_ZZ", | |
5003 "en_Moon_US", | |
5004 "en_Moon" | |
5005 }, { | |
5006 "und_Moon_CN", | |
5007 "zh_Moon_CN", | |
5008 "zh_Moon" | |
5009 }, { | |
5010 "und_Moon_TW", | |
5011 "zh_Moon_TW", | |
5012 "zh_Moon_TW" | |
5013 }, { | |
5014 "und_Moon_HK", | |
5015 "zh_Moon_HK", | |
5016 "zh_Moon_HK" | |
5017 }, { | |
5018 "und_Moon_AQ", | |
5019 "und_Moon_AQ", | |
5020 "und_Moon_AQ" | |
5021 }, { | |
5022 "es", | |
5023 "es_Latn_ES", | |
5024 "es" | |
5025 }, { | |
5026 "es_ZZ", | |
5027 "es_Latn_ES", | |
5028 "es" | |
5029 }, { | |
5030 "es_CN", | |
5031 "es_Latn_CN", | |
5032 "es_CN" | |
5033 }, { | |
5034 "es_TW", | |
5035 "es_Latn_TW", | |
5036 "es_TW" | |
5037 }, { | |
5038 "es_HK", | |
5039 "es_Latn_HK", | |
5040 "es_HK" | |
5041 }, { | |
5042 "es_AQ", | |
5043 "es_Latn_AQ", | |
5044 "es_AQ" | |
5045 }, { | |
5046 "es_Zzzz", | |
5047 "es_Latn_ES", | |
5048 "es" | |
5049 }, { | |
5050 "es_Zzzz_ZZ", | |
5051 "es_Latn_ES", | |
5052 "es" | |
5053 }, { | |
5054 "es_Zzzz_CN", | |
5055 "es_Latn_CN", | |
5056 "es_CN" | |
5057 }, { | |
5058 "es_Zzzz_TW", | |
5059 "es_Latn_TW", | |
5060 "es_TW" | |
5061 }, { | |
5062 "es_Zzzz_HK", | |
5063 "es_Latn_HK", | |
5064 "es_HK" | |
5065 }, { | |
5066 "es_Zzzz_AQ", | |
5067 "es_Latn_AQ", | |
5068 "es_AQ" | |
5069 }, { | |
5070 "es_Latn", | |
5071 "es_Latn_ES", | |
5072 "es" | |
5073 }, { | |
5074 "es_Latn_ZZ", | |
5075 "es_Latn_ES", | |
5076 "es" | |
5077 }, { | |
5078 "es_Latn_CN", | |
5079 "es_Latn_CN", | |
5080 "es_CN" | |
5081 }, { | |
5082 "es_Latn_TW", | |
5083 "es_Latn_TW", | |
5084 "es_TW" | |
5085 }, { | |
5086 "es_Latn_HK", | |
5087 "es_Latn_HK", | |
5088 "es_HK" | |
5089 }, { | |
5090 "es_Latn_AQ", | |
5091 "es_Latn_AQ", | |
5092 "es_AQ" | |
5093 }, { | |
5094 "es_Hans", | |
5095 "es_Hans_ES", | |
5096 "es_Hans" | |
5097 }, { | |
5098 "es_Hans_ZZ", | |
5099 "es_Hans_ES", | |
5100 "es_Hans" | |
5101 }, { | |
5102 "es_Hans_CN", | |
5103 "es_Hans_CN", | |
5104 "es_Hans_CN" | |
5105 }, { | |
5106 "es_Hans_TW", | |
5107 "es_Hans_TW", | |
5108 "es_Hans_TW" | |
5109 }, { | |
5110 "es_Hans_HK", | |
5111 "es_Hans_HK", | |
5112 "es_Hans_HK" | |
5113 }, { | |
5114 "es_Hans_AQ", | |
5115 "es_Hans_AQ", | |
5116 "es_Hans_AQ" | |
5117 }, { | |
5118 "es_Hant", | |
5119 "es_Hant_ES", | |
5120 "es_Hant" | |
5121 }, { | |
5122 "es_Hant_ZZ", | |
5123 "es_Hant_ES", | |
5124 "es_Hant" | |
5125 }, { | |
5126 "es_Hant_CN", | |
5127 "es_Hant_CN", | |
5128 "es_Hant_CN" | |
5129 }, { | |
5130 "es_Hant_TW", | |
5131 "es_Hant_TW", | |
5132 "es_Hant_TW" | |
5133 }, { | |
5134 "es_Hant_HK", | |
5135 "es_Hant_HK", | |
5136 "es_Hant_HK" | |
5137 }, { | |
5138 "es_Hant_AQ", | |
5139 "es_Hant_AQ", | |
5140 "es_Hant_AQ" | |
5141 }, { | |
5142 "es_Moon", | |
5143 "es_Moon_ES", | |
5144 "es_Moon" | |
5145 }, { | |
5146 "es_Moon_ZZ", | |
5147 "es_Moon_ES", | |
5148 "es_Moon" | |
5149 }, { | |
5150 "es_Moon_CN", | |
5151 "es_Moon_CN", | |
5152 "es_Moon_CN" | |
5153 }, { | |
5154 "es_Moon_TW", | |
5155 "es_Moon_TW", | |
5156 "es_Moon_TW" | |
5157 }, { | |
5158 "es_Moon_HK", | |
5159 "es_Moon_HK", | |
5160 "es_Moon_HK" | |
5161 }, { | |
5162 "es_Moon_AQ", | |
5163 "es_Moon_AQ", | |
5164 "es_Moon_AQ" | |
5165 }, { | |
5166 "zh", | |
5167 "zh_Hans_CN", | |
5168 "zh" | |
5169 }, { | |
5170 "zh_ZZ", | |
5171 "zh_Hans_CN", | |
5172 "zh" | |
5173 }, { | |
5174 "zh_CN", | |
5175 "zh_Hans_CN", | |
5176 "zh" | |
5177 }, { | |
5178 "zh_TW", | |
5179 "zh_Hant_TW", | |
5180 "zh_TW" | |
5181 }, { | |
5182 "zh_HK", | |
5183 "zh_Hant_HK", | |
5184 "zh_HK" | |
5185 }, { | |
5186 "zh_AQ", | |
5187 "zh_Hans_AQ", | |
5188 "zh_AQ" | |
5189 }, { | |
5190 "zh_Zzzz", | |
5191 "zh_Hans_CN", | |
5192 "zh" | |
5193 }, { | |
5194 "zh_Zzzz_ZZ", | |
5195 "zh_Hans_CN", | |
5196 "zh" | |
5197 }, { | |
5198 "zh_Zzzz_CN", | |
5199 "zh_Hans_CN", | |
5200 "zh" | |
5201 }, { | |
5202 "zh_Zzzz_TW", | |
5203 "zh_Hant_TW", | |
5204 "zh_TW" | |
5205 }, { | |
5206 "zh_Zzzz_HK", | |
5207 "zh_Hant_HK", | |
5208 "zh_HK" | |
5209 }, { | |
5210 "zh_Zzzz_AQ", | |
5211 "zh_Hans_AQ", | |
5212 "zh_AQ" | |
5213 }, { | |
5214 "zh_Latn", | |
5215 "zh_Latn_CN", | |
5216 "zh_Latn" | |
5217 }, { | |
5218 "zh_Latn_ZZ", | |
5219 "zh_Latn_CN", | |
5220 "zh_Latn" | |
5221 }, { | |
5222 "zh_Latn_CN", | |
5223 "zh_Latn_CN", | |
5224 "zh_Latn" | |
5225 }, { | |
5226 "zh_Latn_TW", | |
5227 "zh_Latn_TW", | |
5228 "zh_Latn_TW" | |
5229 }, { | |
5230 "zh_Latn_HK", | |
5231 "zh_Latn_HK", | |
5232 "zh_Latn_HK" | |
5233 }, { | |
5234 "zh_Latn_AQ", | |
5235 "zh_Latn_AQ", | |
5236 "zh_Latn_AQ" | |
5237 }, { | |
5238 "zh_Hans", | |
5239 "zh_Hans_CN", | |
5240 "zh" | |
5241 }, { | |
5242 "zh_Hans_ZZ", | |
5243 "zh_Hans_CN", | |
5244 "zh" | |
5245 }, { | |
5246 "zh_Hans_TW", | |
5247 "zh_Hans_TW", | |
5248 "zh_Hans_TW" | |
5249 }, { | |
5250 "zh_Hans_HK", | |
5251 "zh_Hans_HK", | |
5252 "zh_Hans_HK" | |
5253 }, { | |
5254 "zh_Hans_AQ", | |
5255 "zh_Hans_AQ", | |
5256 "zh_AQ" | |
5257 }, { | |
5258 "zh_Hant", | |
5259 "zh_Hant_TW", | |
5260 "zh_TW" | |
5261 }, { | |
5262 "zh_Hant_ZZ", | |
5263 "zh_Hant_TW", | |
5264 "zh_TW" | |
5265 }, { | |
5266 "zh_Hant_CN", | |
5267 "zh_Hant_CN", | |
5268 "zh_Hant_CN" | |
5269 }, { | |
5270 "zh_Hant_AQ", | |
5271 "zh_Hant_AQ", | |
5272 "zh_Hant_AQ" | |
5273 }, { | |
5274 "zh_Moon", | |
5275 "zh_Moon_CN", | |
5276 "zh_Moon" | |
5277 }, { | |
5278 "zh_Moon_ZZ", | |
5279 "zh_Moon_CN", | |
5280 "zh_Moon" | |
5281 }, { | |
5282 "zh_Moon_CN", | |
5283 "zh_Moon_CN", | |
5284 "zh_Moon" | |
5285 }, { | |
5286 "zh_Moon_TW", | |
5287 "zh_Moon_TW", | |
5288 "zh_Moon_TW" | |
5289 }, { | |
5290 "zh_Moon_HK", | |
5291 "zh_Moon_HK", | |
5292 "zh_Moon_HK" | |
5293 }, { | |
5294 "zh_Moon_AQ", | |
5295 "zh_Moon_AQ", | |
5296 "zh_Moon_AQ" | |
5297 }, { | |
5298 "art", | |
5299 "", | |
5300 "" | |
5301 }, { | |
5302 "art_ZZ", | |
5303 "", | |
5304 "" | |
5305 }, { | |
5306 "art_CN", | |
5307 "", | |
5308 "" | |
5309 }, { | |
5310 "art_TW", | |
5311 "", | |
5312 "" | |
5313 }, { | |
5314 "art_HK", | |
5315 "", | |
5316 "" | |
5317 }, { | |
5318 "art_AQ", | |
5319 "", | |
5320 "" | |
5321 }, { | |
5322 "art_Zzzz", | |
5323 "", | |
5324 "" | |
5325 }, { | |
5326 "art_Zzzz_ZZ", | |
5327 "", | |
5328 "" | |
5329 }, { | |
5330 "art_Zzzz_CN", | |
5331 "", | |
5332 "" | |
5333 }, { | |
5334 "art_Zzzz_TW", | |
5335 "", | |
5336 "" | |
5337 }, { | |
5338 "art_Zzzz_HK", | |
5339 "", | |
5340 "" | |
5341 }, { | |
5342 "art_Zzzz_AQ", | |
5343 "", | |
5344 "" | |
5345 }, { | |
5346 "art_Latn", | |
5347 "", | |
5348 "" | |
5349 }, { | |
5350 "art_Latn_ZZ", | |
5351 "", | |
5352 "" | |
5353 }, { | |
5354 "art_Latn_CN", | |
5355 "", | |
5356 "" | |
5357 }, { | |
5358 "art_Latn_TW", | |
5359 "", | |
5360 "" | |
5361 }, { | |
5362 "art_Latn_HK", | |
5363 "", | |
5364 "" | |
5365 }, { | |
5366 "art_Latn_AQ", | |
5367 "", | |
5368 "" | |
5369 }, { | |
5370 "art_Hans", | |
5371 "", | |
5372 "" | |
5373 }, { | |
5374 "art_Hans_ZZ", | |
5375 "", | |
5376 "" | |
5377 }, { | |
5378 "art_Hans_CN", | |
5379 "", | |
5380 "" | |
5381 }, { | |
5382 "art_Hans_TW", | |
5383 "", | |
5384 "" | |
5385 }, { | |
5386 "art_Hans_HK", | |
5387 "", | |
5388 "" | |
5389 }, { | |
5390 "art_Hans_AQ", | |
5391 "", | |
5392 "" | |
5393 }, { | |
5394 "art_Hant", | |
5395 "", | |
5396 "" | |
5397 }, { | |
5398 "art_Hant_ZZ", | |
5399 "", | |
5400 "" | |
5401 }, { | |
5402 "art_Hant_CN", | |
5403 "", | |
5404 "" | |
5405 }, { | |
5406 "art_Hant_TW", | |
5407 "", | |
5408 "" | |
5409 }, { | |
5410 "art_Hant_HK", | |
5411 "", | |
5412 "" | |
5413 }, { | |
5414 "art_Hant_AQ", | |
5415 "", | |
5416 "" | |
5417 }, { | |
5418 "art_Moon", | |
5419 "", | |
5420 "" | |
5421 }, { | |
5422 "art_Moon_ZZ", | |
5423 "", | |
5424 "" | |
5425 }, { | |
5426 "art_Moon_CN", | |
5427 "", | |
5428 "" | |
5429 }, { | |
5430 "art_Moon_TW", | |
5431 "", | |
5432 "" | |
5433 }, { | |
5434 "art_Moon_HK", | |
5435 "", | |
5436 "" | |
5437 }, { | |
5438 "art_Moon_AQ", | |
5439 "", | |
5440 "" | |
5441 }, { | |
5442 "de@collation=phonebook", | |
5443 "de_Latn_DE@collation=phonebook", | |
5444 "de@collation=phonebook" | |
5445 } | |
5446 }; | |
5447 | |
5448 typedef struct errorDataTag { | |
5449 const char* tag; | |
5450 const char* expected; | |
5451 UErrorCode uerror; | |
5452 int32_t bufferSize; | |
5453 } errorData; | |
5454 | |
5455 const errorData maximizeErrors[] = { | |
5456 { | |
5457 "enfueiujhytdf", | |
5458 NULL, | |
5459 U_ILLEGAL_ARGUMENT_ERROR, | |
5460 -1 | |
5461 }, | |
5462 { | |
5463 "en_THUJIOGIURJHGJFURYHFJGURYYYHHGJURHG", | |
5464 NULL, | |
5465 U_ILLEGAL_ARGUMENT_ERROR, | |
5466 -1 | |
5467 }, | |
5468 { | |
5469 "en_THUJIOGIURJHGJFURYHFJGURYYYHHGJURHG", | |
5470 NULL, | |
5471 U_ILLEGAL_ARGUMENT_ERROR, | |
5472 -1 | |
5473 }, | |
5474 { | |
5475 "en_Latn_US_POSIX@currency=EURO", | |
5476 "en_Latn_US_POSIX@currency=EURO", | |
5477 U_BUFFER_OVERFLOW_ERROR, | |
5478 29 | |
5479 }, | |
5480 { | |
5481 "en_Latn_US_POSIX@currency=EURO", | |
5482 "en_Latn_US_POSIX@currency=EURO", | |
5483 U_STRING_NOT_TERMINATED_WARNING, | |
5484 30 | |
5485 } | |
5486 }; | |
5487 | |
5488 const errorData minimizeErrors[] = { | |
5489 { | |
5490 "enfueiujhytdf", | |
5491 NULL, | |
5492 U_ILLEGAL_ARGUMENT_ERROR, | |
5493 -1 | |
5494 }, | |
5495 { | |
5496 "en_THUJIOGIURJHGJFURYHFJGURYYYHHGJURHG", | |
5497 NULL, | |
5498 U_ILLEGAL_ARGUMENT_ERROR, | |
5499 -1 | |
5500 }, | |
5501 { | |
5502 "en_Latn_US_POSIX@currency=EURO", | |
5503 "en__POSIX@currency=EURO", | |
5504 U_BUFFER_OVERFLOW_ERROR, | |
5505 22 | |
5506 }, | |
5507 { | |
5508 "en_Latn_US_POSIX@currency=EURO", | |
5509 "en__POSIX@currency=EURO", | |
5510 U_STRING_NOT_TERMINATED_WARNING, | |
5511 23 | |
5512 } | |
5513 }; | |
5514 | |
5515 static int32_t getExpectedReturnValue(const errorData* data) | |
5516 { | |
5517 if (data->uerror == U_BUFFER_OVERFLOW_ERROR || | |
5518 data->uerror == U_STRING_NOT_TERMINATED_WARNING) | |
5519 { | |
5520 return strlen(data->expected); | |
5521 } | |
5522 else | |
5523 { | |
5524 return -1; | |
5525 } | |
5526 } | |
5527 | |
5528 static int32_t getBufferSize(const errorData* data, int32_t actualSize) | |
5529 { | |
5530 if (data->expected == NULL) | |
5531 { | |
5532 return actualSize; | |
5533 } | |
5534 else if (data->bufferSize < 0) | |
5535 { | |
5536 return strlen(data->expected) + 1; | |
5537 } | |
5538 else | |
5539 { | |
5540 return data->bufferSize; | |
5541 } | |
5542 } | |
5543 | |
5544 static void TestLikelySubtags() | |
5545 { | |
5546 char buffer[ULOC_FULLNAME_CAPACITY + ULOC_KEYWORD_AND_VALUES_CAPACITY + 1]; | |
5547 int32_t i = 0; | |
5548 | |
5549 for (; i < sizeof(basic_maximize_data) / sizeof(basic_maximize_data[0]); ++i
) | |
5550 { | |
5551 UErrorCode status = U_ZERO_ERROR; | |
5552 const char* const minimal = basic_maximize_data[i][0]; | |
5553 const char* const maximal = basic_maximize_data[i][1]; | |
5554 | |
5555 /* const int32_t length = */ | |
5556 uloc_addLikelySubtags( | |
5557 minimal, | |
5558 buffer, | |
5559 sizeof(buffer), | |
5560 &status); | |
5561 if (U_FAILURE(status)) { | |
5562 log_err_status(status, " unexpected failure of uloc_addLikelySubtag
s(), minimal \"%s\" status %s\n", minimal, u_errorName(status)); | |
5563 status = U_ZERO_ERROR; | |
5564 } | |
5565 else if (uprv_strlen(maximal) == 0) { | |
5566 if (uprv_stricmp(minimal, buffer) != 0) { | |
5567 log_err(" unexpected maximal value \"%s\" in uloc_addLikelySubt
ags(), minimal \"%s\" = \"%s\"\n", maximal, minimal, buffer); | |
5568 } | |
5569 } | |
5570 else if (uprv_stricmp(maximal, buffer) != 0) { | |
5571 log_err(" maximal doesn't match expected %s in uloc_addLikelySubtag
s(), minimal \"%s\" = %s\n", maximal, minimal, buffer); | |
5572 } | |
5573 } | |
5574 | |
5575 for (i = 0; i < sizeof(basic_minimize_data) / sizeof(basic_minimize_data[0])
; ++i) { | |
5576 | |
5577 UErrorCode status = U_ZERO_ERROR; | |
5578 const char* const maximal = basic_minimize_data[i][0]; | |
5579 const char* const minimal = basic_minimize_data[i][1]; | |
5580 | |
5581 /* const int32_t length = */ | |
5582 uloc_minimizeSubtags( | |
5583 maximal, | |
5584 buffer, | |
5585 sizeof(buffer), | |
5586 &status); | |
5587 | |
5588 if (U_FAILURE(status)) { | |
5589 log_err_status(status, " unexpected failure of uloc_MinimizeSubtags
(), maximal \"%s\" status %s\n", maximal, u_errorName(status)); | |
5590 status = U_ZERO_ERROR; | |
5591 } | |
5592 else if (uprv_strlen(minimal) == 0) { | |
5593 if (uprv_stricmp(maximal, buffer) != 0) { | |
5594 log_err(" unexpected minimal value \"%s\" in uloc_minimizeSubta
gs(), maximal \"%s\" = \"%s\"\n", minimal, maximal, buffer); | |
5595 } | |
5596 } | |
5597 else if (uprv_stricmp(minimal, buffer) != 0) { | |
5598 log_err(" minimal doesn't match expected %s in uloc_MinimizeSubtags
(), maximal \"%s\" = %s\n", minimal, maximal, buffer); | |
5599 } | |
5600 } | |
5601 | |
5602 for (i = 0; i < sizeof(full_data) / sizeof(full_data[0]); ++i) { | |
5603 | |
5604 UErrorCode status = U_ZERO_ERROR; | |
5605 const char* const minimal = full_data[i][0]; | |
5606 const char* const maximal = full_data[i][1]; | |
5607 | |
5608 /* const int32_t length = */ | |
5609 uloc_addLikelySubtags( | |
5610 minimal, | |
5611 buffer, | |
5612 sizeof(buffer), | |
5613 &status); | |
5614 if (U_FAILURE(status)) { | |
5615 log_err_status(status, " unexpected failure of uloc_addLikelySubtag
s(), minimal \"%s\" status \"%s\"\n", minimal, u_errorName(status)); | |
5616 status = U_ZERO_ERROR; | |
5617 } | |
5618 else if (uprv_strlen(maximal) == 0) { | |
5619 if (uprv_stricmp(minimal, buffer) != 0) { | |
5620 log_err(" unexpected maximal value \"%s\" in uloc_addLikelySubt
ags(), minimal \"%s\" = \"%s\"\n", maximal, minimal, buffer); | |
5621 } | |
5622 } | |
5623 else if (uprv_stricmp(maximal, buffer) != 0) { | |
5624 log_err(" maximal doesn't match expected \"%s\" in uloc_addLikelySu
btags(), minimal \"%s\" = \"%s\"\n", maximal, minimal, buffer); | |
5625 } | |
5626 } | |
5627 | |
5628 for (i = 0; i < sizeof(full_data) / sizeof(full_data[0]); ++i) { | |
5629 | |
5630 UErrorCode status = U_ZERO_ERROR; | |
5631 const char* const maximal = full_data[i][1]; | |
5632 const char* const minimal = full_data[i][2]; | |
5633 | |
5634 if (strlen(maximal) > 0) { | |
5635 | |
5636 /* const int32_t length = */ | |
5637 uloc_minimizeSubtags( | |
5638 maximal, | |
5639 buffer, | |
5640 sizeof(buffer), | |
5641 &status); | |
5642 | |
5643 if (U_FAILURE(status)) { | |
5644 log_err_status(status, " unexpected failure of uloc_minimizeSub
tags(), maximal \"%s\" status %s\n", maximal, u_errorName(status)); | |
5645 status = U_ZERO_ERROR; | |
5646 } | |
5647 else if (uprv_strlen(minimal) == 0) { | |
5648 if (uprv_stricmp(maximal, buffer) != 0) { | |
5649 log_err(" unexpected minimal value \"%s\" in uloc_minimizeS
ubtags(), maximal \"%s\" = \"%s\"\n", minimal, maximal, buffer); | |
5650 } | |
5651 } | |
5652 else if (uprv_stricmp(minimal, buffer) != 0) { | |
5653 log_err(" minimal doesn't match expected %s in uloc_MinimizeSub
tags(), maximal \"%s\" = %s\n", minimal, maximal, buffer); | |
5654 } | |
5655 } | |
5656 } | |
5657 | |
5658 for (i = 0; i < sizeof(maximizeErrors) / sizeof(maximizeErrors[0]); ++i) { | |
5659 | |
5660 UErrorCode status = U_ZERO_ERROR; | |
5661 const char* const minimal = maximizeErrors[i].tag; | |
5662 const char* const maximal = maximizeErrors[i].expected; | |
5663 const UErrorCode expectedStatus = maximizeErrors[i].uerror; | |
5664 const int32_t expectedLength = getExpectedReturnValue(&maximizeErrors[i]
); | |
5665 const int32_t bufferSize = getBufferSize(&maximizeErrors[i], sizeof(buff
er)); | |
5666 | |
5667 const int32_t length = | |
5668 uloc_addLikelySubtags( | |
5669 minimal, | |
5670 buffer, | |
5671 bufferSize, | |
5672 &status); | |
5673 | |
5674 if (status == U_ZERO_ERROR) { | |
5675 log_err(" unexpected U_ZERO_ERROR for uloc_addLikelySubtags(), mini
mal \"%s\" expected status %s\n", minimal, u_errorName(expectedStatus)); | |
5676 status = U_ZERO_ERROR; | |
5677 } | |
5678 else if (status != expectedStatus) { | |
5679 log_err_status(status, " unexpected status for uloc_addLikelySubtag
s(), minimal \"%s\" expected status %s, but got %s\n", minimal, u_errorName(expe
ctedStatus), u_errorName(status)); | |
5680 } | |
5681 else if (length != expectedLength) { | |
5682 log_err(" unexpected length for uloc_addLikelySubtags(), minimal \"
%s\" expected length %d, but got %d\n", minimal, expectedLength, length); | |
5683 } | |
5684 else if (status == U_BUFFER_OVERFLOW_ERROR || status == U_STRING_NOT_TER
MINATED_WARNING) { | |
5685 if (uprv_strnicmp(maximal, buffer, bufferSize) != 0) { | |
5686 log_err(" maximal doesn't match expected %s in uloc_addLikelySu
btags(), minimal \"%s\" = %*s\n", | |
5687 maximal, minimal, (int)sizeof(buffer), buffer); | |
5688 } | |
5689 } | |
5690 } | |
5691 | |
5692 for (i = 0; i < sizeof(minimizeErrors) / sizeof(minimizeErrors[0]); ++i) { | |
5693 | |
5694 UErrorCode status = U_ZERO_ERROR; | |
5695 const char* const maximal = minimizeErrors[i].tag; | |
5696 const char* const minimal = minimizeErrors[i].expected; | |
5697 const UErrorCode expectedStatus = minimizeErrors[i].uerror; | |
5698 const int32_t expectedLength = getExpectedReturnValue(&minimizeErrors[i]
); | |
5699 const int32_t bufferSize = getBufferSize(&minimizeErrors[i], sizeof(buff
er)); | |
5700 | |
5701 const int32_t length = | |
5702 uloc_minimizeSubtags( | |
5703 maximal, | |
5704 buffer, | |
5705 bufferSize, | |
5706 &status); | |
5707 | |
5708 if (status == U_ZERO_ERROR) { | |
5709 log_err(" unexpected U_ZERO_ERROR for uloc_minimizeSubtags(), maxim
al \"%s\" expected status %s\n", maximal, u_errorName(expectedStatus)); | |
5710 status = U_ZERO_ERROR; | |
5711 } | |
5712 else if (status != expectedStatus) { | |
5713 log_err_status(status, " unexpected status for uloc_minimizeSubtags
(), maximal \"%s\" expected status %s, but got %s\n", maximal, u_errorName(expec
tedStatus), u_errorName(status)); | |
5714 } | |
5715 else if (length != expectedLength) { | |
5716 log_err(" unexpected length for uloc_minimizeSubtags(), maximal \"%
s\" expected length %d, but got %d\n", maximal, expectedLength, length); | |
5717 } | |
5718 else if (status == U_BUFFER_OVERFLOW_ERROR || status == U_STRING_NOT_TER
MINATED_WARNING) { | |
5719 if (uprv_strnicmp(minimal, buffer, bufferSize) != 0) { | |
5720 log_err(" minimal doesn't match expected \"%s\" in uloc_minimiz
eSubtags(), minimal \"%s\" = \"%*s\"\n", | |
5721 minimal, maximal, (int)sizeof(buffer), buffer); | |
5722 } | |
5723 } | |
5724 } | |
5725 } | |
5726 | |
5727 const char* const locale_to_langtag[][3] = { | |
5728 {"", "und", "und"}, | |
5729 {"en", "en", "en"}, | |
5730 {"en_US", "en-US", "en-US"}, | |
5731 {"iw_IL", "he-IL", "he-IL"}, | |
5732 {"sr_Latn_SR", "sr-Latn-SR", "sr-Latn-SR"}, | |
5733 {"en__POSIX", "en-u-va-posix", "en-u-va-posix"}, | |
5734 {"en_POSIX", "en-u-va-posix", "en-u-va-posix"}, | |
5735 {"en_US_POSIX_VAR", "en-US-posix-x-lvariant-var", NULL}, /* variant POSIX_V
AR is processed as regular variant */ | |
5736 {"en_US_VAR_POSIX", "en-US-x-lvariant-var-posix", NULL}, /* variant VAR_POS
IX is processed as regular variant */ | |
5737 {"en_US_POSIX@va=posix2", "en-US-u-va-posix2", "en-US-u-va-posix2"},
/* if keyword va=xxx already exists, variant POSIX is simply dropped */ | |
5738 {"en_US_POSIX@ca=japanese", "en-US-u-ca-japanese-va-posix", "en-US-u-ca-jap
anese-va-posix"}, | |
5739 {"und_555", "und-555", "und-555"}, | |
5740 {"123", "und", NULL}, | |
5741 {"%$#&", "und", NULL}, | |
5742 {"_Latn", "und-Latn", "und-Latn"}, | |
5743 {"_DE", "und-DE", "und-DE"}, | |
5744 {"und_FR", "und-FR", "und-FR"}, | |
5745 {"th_TH_TH", "th-TH-x-lvariant-th", NULL}, | |
5746 {"bogus", "bogus", "bogus"}, | |
5747 {"foooobarrr", "und", NULL}, | |
5748 {"az_AZ_CYRL", "az-Cyrl-AZ", "az-Cyrl-AZ"}, | |
5749 {"aa_BB_CYRL", "aa-BB-x-lvariant-cyrl", NULL}, | |
5750 {"en_US_1234", "en-US-1234", "en-US-1234"}, | |
5751 {"en_US_VARIANTA_VARIANTB", "en-US-varianta-variantb", "en-US-varianta-vari
antb"}, | |
5752 {"ja__9876_5432", "ja-9876-5432", "ja-9876-5432"}, | |
5753 {"zh_Hant__VAR", "zh-Hant-x-lvariant-var", NULL}, | |
5754 {"es__BADVARIANT_GOODVAR", "es-goodvar", NULL}, | |
5755 {"en@calendar=gregorian", "en-u-ca-gregory", "en-u-ca-gregory"}, | |
5756 {"de@collation=phonebook;calendar=gregorian", "de-u-ca-gregory-co-phonebk"
, "de-u-ca-gregory-co-phonebk"}, | |
5757 {"th@numbers=thai;z=extz;x=priv-use;a=exta", "th-a-exta-u-nu-thai-z-extz-x
-priv-use", "th-a-exta-u-nu-thai-z-extz-x-priv-use"}, | |
5758 {"en@timezone=America/New_York;calendar=japanese", "en-u-ca-japanese-tz-u
snyc", "en-u-ca-japanese-tz-usnyc"}, | |
5759 {"en@timezone=US/Eastern", "en-u-tz-usnyc", "en-u-tz-usnyc"}, | |
5760 {"en@x=x-y-z;a=a-b-c", "en-x-x-y-z", NULL}, | |
5761 {"it@collation=badcollationtype;colStrength=identical;cu=usd-eur", "it-u-cu-
usd-eur-ks-identic", NULL}, | |
5762 {"en_US_POSIX", "en-US-u-va-posix", "en-US-u-va-posix"}, | |
5763 {"en_US_POSIX@calendar=japanese;currency=EUR","en-US-u-ca-japanese-cu-eur-va
-posix", "en-US-u-ca-japanese-cu-eur-va-posix"}, | |
5764 {"@x=elmer", "x-elmer", "x-elmer"}, | |
5765 {"en@x=elmer", "en-x-elmer", "en-x-elmer"}, | |
5766 {"@x=elmer;a=exta", "und-a-exta-x-elmer", "und-a-exta-x-elmer"}, | |
5767 {"en_US@attribute=attr1-attr2;calendar=gregorian", "en-US-u-attr1-attr2-ca-g
regory", "en-US-u-attr1-attr2-ca-gregory"}, | |
5768 {NULL, NULL, NULL} | |
5769 }; | |
5770 | |
5771 static void TestToLanguageTag(void) { | |
5772 char langtag[256]; | |
5773 int32_t i; | |
5774 UErrorCode status; | |
5775 int32_t len; | |
5776 const char *inloc; | |
5777 const char *expected; | |
5778 | |
5779 for (i = 0; locale_to_langtag[i][0] != NULL; i++) { | |
5780 inloc = locale_to_langtag[i][0]; | |
5781 | |
5782 /* testing non-strict mode */ | |
5783 status = U_ZERO_ERROR; | |
5784 langtag[0] = 0; | |
5785 expected = locale_to_langtag[i][1]; | |
5786 | |
5787 len = uloc_toLanguageTag(inloc, langtag, sizeof(langtag), FALSE, &status
); | |
5788 (void)len; /* Suppress set but not used warning. */ | |
5789 if (U_FAILURE(status)) { | |
5790 if (expected != NULL) { | |
5791 log_err("Error returned by uloc_toLanguageTag for locale id [%s]
- error: %s\n", | |
5792 inloc, u_errorName(status)); | |
5793 } | |
5794 } else { | |
5795 if (expected == NULL) { | |
5796 log_err("Error should be returned by uloc_toLanguageTag for loca
le id [%s], but [%s] is returned without errors\n", | |
5797 inloc, langtag); | |
5798 } else if (uprv_strcmp(langtag, expected) != 0) { | |
5799 log_data_err("uloc_toLanguageTag returned language tag [%s] for
input locale [%s] - expected: [%s]. Are you missing data?\n", | |
5800 langtag, inloc, expected); | |
5801 } | |
5802 } | |
5803 | |
5804 /* testing strict mode */ | |
5805 status = U_ZERO_ERROR; | |
5806 langtag[0] = 0; | |
5807 expected = locale_to_langtag[i][2]; | |
5808 | |
5809 len = uloc_toLanguageTag(inloc, langtag, sizeof(langtag), TRUE, &status)
; | |
5810 if (U_FAILURE(status)) { | |
5811 if (expected != NULL) { | |
5812 log_data_err("Error returned by uloc_toLanguageTag {strict} for
locale id [%s] - error: %s Are you missing data?\n", | |
5813 inloc, u_errorName(status)); | |
5814 } | |
5815 } else { | |
5816 if (expected == NULL) { | |
5817 log_err("Error should be returned by uloc_toLanguageTag {strict}
for locale id [%s], but [%s] is returned without errors\n", | |
5818 inloc, langtag); | |
5819 } else if (uprv_strcmp(langtag, expected) != 0) { | |
5820 log_err("uloc_toLanguageTag {strict} returned language tag [%s]
for input locale [%s] - expected: [%s]\n", | |
5821 langtag, inloc, expected); | |
5822 } | |
5823 } | |
5824 } | |
5825 } | |
5826 | |
5827 #define FULL_LENGTH -1 | |
5828 static const struct { | |
5829 const char *bcpID; | |
5830 const char *locID; | |
5831 int32_t len; | |
5832 } langtag_to_locale[] = { | |
5833 {"ja-u-ijkl-efgh-abcd-ca-japanese-xx-yyy-zzz-kn", "ja@attribute=abcd-efgh-
ijkl;calendar=japanese;colnumeric=yes;xx=yyy-zzz", FULL_LENGTH}, | |
5834 {"en", "en", FULL_LENGTH}, | |
5835 {"en-us", "en_US", FULL_LENGTH}, | |
5836 {"und-US", "_US", FULL_LENGTH}, | |
5837 {"und-latn", "_Latn", FULL_LENGTH}, | |
5838 {"en-US-posix", "en_US_POSIX", FULL_LENGTH}, | |
5839 {"de-de_euro", "de", 2}, | |
5840 {"kok-IN", "kok_IN", FULL_LENGTH}, | |
5841 {"123", "", 0}, | |
5842 {"en_us", "", 0}, | |
5843 {"en-latn-x", "en_Latn", 7}, | |
5844 {"art-lojban", "jbo", FULL_LENGTH}, | |
5845 {"zh-hakka", "hak", FULL_LENGTH}, | |
5846 {"zh-cmn-CH", "cmn_CH", FULL_LENGTH}, | |
5847 {"xxx-yy", "xxx_YY", FULL_LENGTH}, | |
5848 {"fr-234", "fr_234", FULL_LENGTH}, | |
5849 {"i-default", "en@x=i-default", FULL_LENGTH}, | |
5850 {"i-test", "", 0}, | |
5851 {"ja-jp-jp", "ja_JP", 5}, | |
5852 {"bogus", "bogus", FULL_LENGTH}, | |
5853 {"boguslang", "", 0}, | |
5854 {"EN-lATN-us", "en_Latn_US", FULL_LENGTH}, | |
5855 {"und-variant-1234", "__VARIANT_1234", FULL_LENGTH}, | |
5856 {"und-varzero-var1-vartwo", "__VARZERO", 11}, | |
5857 {"en-u-ca-gregory", "en@calendar=gregorian", FULL_LENGTH}, | |
5858 {"en-U-cu-USD", "en@currency=usd", FULL_LENGTH}, | |
5859 {"en-US-u-va-posix", "en_US_POSIX", FULL_LENGTH}, | |
5860 {"en-us-u-ca-gregory-va-posix", "en_US_POSIX@calendar=gregorian", FULL_LEN
GTH}, | |
5861 {"en-us-posix-u-va-posix", "en_US_POSIX@va=posix", FULL_LENGTH}, | |
5862 {"en-us-u-va-posix2", "en_US@va=posix2", FULL_LENGTH}, | |
5863 {"en-us-vari1-u-va-posix", "en_US_VARI1@va=posix", FULL_LENGTH}, | |
5864 {"ar-x-1-2-3", "ar@x=1-2-3", FULL_LENGTH}, | |
5865 {"fr-u-nu-latn-cu-eur", "fr@currency=eur;numbers=latn", FULL_LENGTH}, | |
5866 {"de-k-kext-u-co-phonebk-nu-latn", "de@collation=phonebook;k=kext;numbers=l
atn", FULL_LENGTH}, | |
5867 {"ja-u-cu-jpy-ca-jp", "ja@calendar=yes;currency=jpy;jp=yes", FULL_LENGTH}
, | |
5868 {"en-us-u-tz-usnyc", "en_US@timezone=America/New_York", FULL_LENGTH}, | |
5869 {"und-a-abc-def", "und@a=abc-def", FULL_LENGTH}, | |
5870 {"zh-u-ca-chinese-x-u-ca-chinese", "zh@calendar=chinese;x=u-ca-chinese",
FULL_LENGTH}, | |
5871 {"x-elmer", "@x=elmer", FULL_LENGTH}, | |
5872 {"en-US-u-attr1-attr2-ca-gregory", "en_US@attribute=attr1-attr2;calendar=gre
gorian", FULL_LENGTH}, | |
5873 {"sr-u-kn", "sr@colnumeric=yes", FULL_LENGTH}, | |
5874 {"de-u-kn-co-phonebk", "de@collation=phonebook;colnumeric=yes", FULL_LEN
GTH}, | |
5875 {"en-u-attr2-attr1-kn-kb", "en@attribute=attr1-attr2;colbackwards=yes;colnu
meric=yes", FULL_LENGTH}, | |
5876 {"ja-u-ijkl-efgh-abcd-ca-japanese-xx-yyy-zzz-kn", "ja@attribute=abcd-efgh-
ijkl;calendar=japanese;colnumeric=yes;xx=yyy-zzz", FULL_LENGTH}, | |
5877 | |
5878 {"de-u-xc-xphonebk-co-phonebk-ca-buddhist-mo-very-lo-extensi-xd-that-de-shou
ld-vc-probably-xz-killthebuffer", | |
5879 "de@calendar=buddhist;collation=phonebook;de=should;lo=extensi;mo=very;vc=p
robably;xc=xphonebk;xd=that;xz=yes", 91}, | |
5880 {NULL, NULL, 0} | |
5881 }; | |
5882 | |
5883 static void TestForLanguageTag(void) { | |
5884 char locale[256]; | |
5885 int32_t i; | |
5886 UErrorCode status; | |
5887 int32_t parsedLen; | |
5888 int32_t expParsedLen; | |
5889 | |
5890 for (i = 0; langtag_to_locale[i].bcpID != NULL; i++) { | |
5891 status = U_ZERO_ERROR; | |
5892 locale[0] = 0; | |
5893 expParsedLen = langtag_to_locale[i].len; | |
5894 if (expParsedLen == FULL_LENGTH) { | |
5895 expParsedLen = uprv_strlen(langtag_to_locale[i].bcpID); | |
5896 } | |
5897 uloc_forLanguageTag(langtag_to_locale[i].bcpID, locale, sizeof(locale),
&parsedLen, &status); | |
5898 if (U_FAILURE(status)) { | |
5899 log_err_status(status, "Error returned by uloc_forLanguageTag for la
nguage tag [%s] - error: %s\n", | |
5900 langtag_to_locale[i].bcpID, u_errorName(status)); | |
5901 } else { | |
5902 if (uprv_strcmp(langtag_to_locale[i].locID, locale) != 0) { | |
5903 log_data_err("uloc_forLanguageTag returned locale [%s] for input
language tag [%s] - expected: [%s]\n", | |
5904 locale, langtag_to_locale[i].bcpID, langtag_to_locale[i].loc
ID); | |
5905 } | |
5906 if (parsedLen != expParsedLen) { | |
5907 log_err("uloc_forLanguageTag parsed length of %d for input langu
age tag [%s] - expected parsed length: %d\n", | |
5908 parsedLen, langtag_to_locale[i].bcpID, expParsedLen); | |
5909 } | |
5910 } | |
5911 } | |
5912 } | |
5913 | |
5914 static void TestToUnicodeLocaleKey(void) | |
5915 { | |
5916 /* $IN specifies the result should be the input pointer itself */ | |
5917 static const char* DATA[][2] = { | |
5918 {"calendar", "ca"}, | |
5919 {"CALEndar", "ca"}, /* difference casing */ | |
5920 {"ca", "ca"}, /* bcp key itself */ | |
5921 {"kv", "kv"}, /* no difference between legacy and bcp */ | |
5922 {"foo", NULL}, /* unknown, bcp ill-formed */ | |
5923 {"ZZ", "$IN"}, /* unknown, bcp well-formed - */ | |
5924 {NULL, NULL} | |
5925 }; | |
5926 | |
5927 int32_t i; | |
5928 for (i = 0; DATA[i][0] != NULL; i++) { | |
5929 const char* keyword = DATA[i][0]; | |
5930 const char* expected = DATA[i][1]; | |
5931 const char* bcpKey = NULL; | |
5932 | |
5933 bcpKey = uloc_toUnicodeLocaleKey(keyword); | |
5934 if (expected == NULL) { | |
5935 if (bcpKey != NULL) { | |
5936 log_err("toUnicodeLocaleKey: keyword=%s => %s, expected=NULL\n",
keyword, bcpKey); | |
5937 } | |
5938 } else if (bcpKey == NULL) { | |
5939 log_data_err("toUnicodeLocaleKey: keyword=%s => NULL, expected=%s\n"
, keyword, expected); | |
5940 } else if (uprv_strcmp(expected, "$IN") == 0) { | |
5941 if (bcpKey != keyword) { | |
5942 log_err("toUnicodeLocaleKey: keyword=%s => %s, expected=%s(input
pointer)\n", keyword, bcpKey, keyword); | |
5943 } | |
5944 } else if (uprv_strcmp(bcpKey, expected) != 0) { | |
5945 log_err("toUnicodeLocaleKey: keyword=%s => %s, expected=%s\n", keywo
rd, bcpKey, expected); | |
5946 } | |
5947 } | |
5948 } | |
5949 | |
5950 static void TestToLegacyKey(void) | |
5951 { | |
5952 /* $IN specifies the result should be the input pointer itself */ | |
5953 static const char* DATA[][2] = { | |
5954 {"kb", "colbackwards"}, | |
5955 {"kB", "colbackwards"}, /* different casing */ | |
5956 {"Collation", "collation"}, /* keyword itself with different casing
*/ | |
5957 {"kv", "kv"}, /* no difference between legacy and bcp */ | |
5958 {"foo", "$IN"}, /* unknown, bcp ill-formed */ | |
5959 {"ZZ", "$IN"}, /* unknown, bcp well-formed */ | |
5960 {"e=mc2", NULL}, /* unknown, bcp/legacy ill-formed */ | |
5961 {NULL, NULL} | |
5962 }; | |
5963 | |
5964 int32_t i; | |
5965 for (i = 0; DATA[i][0] != NULL; i++) { | |
5966 const char* keyword = DATA[i][0]; | |
5967 const char* expected = DATA[i][1]; | |
5968 const char* legacyKey = NULL; | |
5969 | |
5970 legacyKey = uloc_toLegacyKey(keyword); | |
5971 if (expected == NULL) { | |
5972 if (legacyKey != NULL) { | |
5973 log_err("toLegacyKey: keyword=%s => %s, expected=NULL\n", keywor
d, legacyKey); | |
5974 } | |
5975 } else if (legacyKey == NULL) { | |
5976 log_err("toLegacyKey: keyword=%s => NULL, expected=%s\n", keyword, e
xpected); | |
5977 } else if (uprv_strcmp(expected, "$IN") == 0) { | |
5978 if (legacyKey != keyword) { | |
5979 log_err("toLegacyKey: keyword=%s => %s, expected=%s(input pointe
r)\n", keyword, legacyKey, keyword); | |
5980 } | |
5981 } else if (uprv_strcmp(legacyKey, expected) != 0) { | |
5982 log_data_err("toUnicodeLocaleKey: keyword=%s, %s, expected=%s\n", ke
yword, legacyKey, expected); | |
5983 } | |
5984 } | |
5985 } | |
5986 | |
5987 static void TestToUnicodeLocaleType(void) | |
5988 { | |
5989 /* $IN specifies the result should be the input pointer itself */ | |
5990 static const char* DATA[][3] = { | |
5991 {"tz", "Asia/Kolkata", "inccu"}, | |
5992 {"calendar", "gregorian", "gregory"}, | |
5993 {"ca", "gregorian", "gregory"}, | |
5994 {"ca", "Gregorian", "gregory"}, | |
5995 {"ca", "buddhist", "buddhist"}, | |
5996 {"Calendar", "Japanese", "japanese"}, | |
5997 {"calendar", "Islamic-Civil", "islamic-civil"}, | |
5998 {"calendar", "islamicc", "islamic-civil"}, /* bcp type
alias */ | |
5999 {"colalternate", "NON-IGNORABLE", "noignore"}, | |
6000 {"colcaselevel", "yes", "true"}, | |
6001 {"tz", "america/new_york", "usnyc"}, | |
6002 {"tz", "Asia/Kolkata", "inccu"}, | |
6003 {"timezone", "navajo", "usden"}, | |
6004 {"ca", "aaaa", "$IN"}, /* unknown type, wel
l-formed type */ | |
6005 {"ca", "gregory-japanese-islamic", "$IN"}, /* unknown type,
well-formed type */ | |
6006 {"zz", "gregorian", NULL}, /* unknown key, ill-
formed type */ | |
6007 {"co", "foo-", NULL}, /* unknown type, ill
-formed type */ | |
6008 {"variableTop", "00A0", "$IN"}, /* valid codepoints
type */ | |
6009 {"variableTop", "wxyz", "$IN"}, /* invalid codepoint
s type - return as is for now */ | |
6010 {"kr", "space-punct", "space-punct"}, /* valid reorder
code type */ | |
6011 {"kr", "digit-spacepunct", NULL}, /* invalid (bcp ill-
formed) reordercode type */ | |
6012 {NULL, NULL, NULL} | |
6013 }; | |
6014 | |
6015 int32_t i; | |
6016 for (i = 0; DATA[i][0] != NULL; i++) { | |
6017 const char* keyword = DATA[i][0]; | |
6018 const char* value = DATA[i][1]; | |
6019 const char* expected = DATA[i][2]; | |
6020 const char* bcpType = NULL; | |
6021 | |
6022 bcpType = uloc_toUnicodeLocaleType(keyword, value); | |
6023 if (expected == NULL) { | |
6024 if (bcpType != NULL) { | |
6025 log_err("toUnicodeLocaleType: keyword=%s, value=%s => %s, expect
ed=NULL\n", keyword, value, bcpType); | |
6026 } | |
6027 } else if (bcpType == NULL) { | |
6028 log_data_err("toUnicodeLocaleType: keyword=%s, value=%s => NULL, exp
ected=%s\n", keyword, value, expected); | |
6029 } else if (uprv_strcmp(expected, "$IN") == 0) { | |
6030 if (bcpType != value) { | |
6031 log_err("toUnicodeLocaleType: keyword=%s, value=%s => %s, expect
ed=%s(input pointer)\n", keyword, value, bcpType, value); | |
6032 } | |
6033 } else if (uprv_strcmp(bcpType, expected) != 0) { | |
6034 log_data_err("toUnicodeLocaleType: keyword=%s, value=%s => %s, expec
ted=%s\n", keyword, value, bcpType, expected); | |
6035 } | |
6036 } | |
6037 } | |
6038 | |
6039 static void TestToLegacyType(void) | |
6040 { | |
6041 /* $IN specifies the result should be the input pointer itself */ | |
6042 static const char* DATA[][3] = { | |
6043 {"calendar", "gregory", "gregorian"}, | |
6044 {"ca", "gregory", "gregorian"}, | |
6045 {"ca", "Gregory", "gregorian"}, | |
6046 {"ca", "buddhist", "buddhist"}, | |
6047 {"Calendar", "Japanese", "japanese"}, | |
6048 {"calendar", "Islamic-Civil", "islamic-civil"}, | |
6049 {"calendar", "islamicc", "islamic-civil"}, /* bcp type
alias */ | |
6050 {"colalternate", "noignore", "non-ignorable"}, | |
6051 {"colcaselevel", "true", "yes"}, | |
6052 {"tz", "usnyc", "America/New_York"}, | |
6053 {"tz", "inccu", "Asia/Calcutta"}, | |
6054 {"timezone", "usden", "America/Denver"}, | |
6055 {"timezone", "usnavajo", "America/Denver"}, /* bcp type
alias */ | |
6056 {"colstrength", "quarternary", "quaternary"}, /* type alias */ | |
6057 {"ca", "aaaa", "$IN"}, /* unknown type */ | |
6058 {"calendar", "gregory-japanese-islamic", "$IN"}, /* unknown type,
well-formed type */ | |
6059 {"zz", "gregorian", "$IN"}, /* unknown key, bcp ill-
formed type */ | |
6060 {"ca", "gregorian-calendar", "$IN"}, /* known key, bcp il
l-formed type */ | |
6061 {"co", "e=mc2", NULL}, /* known key, ill-formed
bcp/legacy type */ | |
6062 {"variableTop", "00A0", "$IN"}, /* valid codepoints
type */ | |
6063 {"variableTop", "wxyz", "$IN"}, /* invalid codepoints
type - return as is for now */ | |
6064 {"kr", "space-punct", "space-punct"}, /* valid reorder
code type */ | |
6065 {"kr", "digit-spacepunct", "digit-spacepunct"}, /* inval
id reordercode type, but ok for legacy syntax */ | |
6066 {NULL, NULL, NULL} | |
6067 }; | |
6068 | |
6069 int32_t i; | |
6070 for (i = 0; DATA[i][0] != NULL; i++) { | |
6071 const char* keyword = DATA[i][0]; | |
6072 const char* value = DATA[i][1]; | |
6073 const char* expected = DATA[i][2]; | |
6074 const char* legacyType = NULL; | |
6075 | |
6076 legacyType = uloc_toLegacyType(keyword, value); | |
6077 if (expected == NULL) { | |
6078 if (legacyType != NULL) { | |
6079 log_err("toLegacyType: keyword=%s, value=%s => %s, expected=NULL
\n", keyword, value, legacyType); | |
6080 } | |
6081 } else if (legacyType == NULL) { | |
6082 log_err("toLegacyType: keyword=%s, value=%s => NULL, expected=%s\n",
keyword, value, expected); | |
6083 } else if (uprv_strcmp(expected, "$IN") == 0) { | |
6084 if (legacyType != value) { | |
6085 log_err("toLegacyType: keyword=%s, value=%s => %s, expected=%s(i
nput pointer)\n", keyword, value, legacyType, value); | |
6086 } | |
6087 } else if (uprv_strcmp(legacyType, expected) != 0) { | |
6088 log_data_err("toLegacyType: keyword=%s, value=%s => %s, expected=%s\
n", keyword, value, legacyType, expected); | |
6089 } | |
6090 } | |
6091 } | |
6092 | |
6093 | |
6094 | |
6095 static void test_unicode_define(const char *namech, char ch, const char *nameu,
UChar uch) | |
6096 { | |
6097 UChar asUch[1]; | |
6098 asUch[0]=0; | |
6099 log_verbose("Testing whether %s[\\x%02x,'%c'] == %s[U+%04X]\n", namech, ch,(in
t)ch, nameu, (int) uch); | |
6100 u_charsToUChars(&ch, asUch, 1); | |
6101 if(asUch[0] != uch) { | |
6102 log_err("FAIL: %s[\\x%02x,'%c'] maps to U+%04X, but %s = U+%04X\n", namech,
ch, (int)ch, (int)asUch[0], nameu, (int)uch); | |
6103 } else { | |
6104 log_verbose(" .. OK, == U+%04X\n", (int)asUch[0]); | |
6105 } | |
6106 } | |
6107 | |
6108 #define TEST_UNICODE_DEFINE(x,y) test_unicode_define(#x, (char)(x), #y, (UChar)(
y)) | |
6109 | |
6110 static void TestUnicodeDefines(void) { | |
6111 TEST_UNICODE_DEFINE(ULOC_KEYWORD_SEPARATOR, ULOC_KEYWORD_SEPARATOR_UNICODE); | |
6112 TEST_UNICODE_DEFINE(ULOC_KEYWORD_ASSIGN, ULOC_KEYWORD_ASSIGN_UNICODE); | |
6113 TEST_UNICODE_DEFINE(ULOC_KEYWORD_ITEM_SEPARATOR, ULOC_KEYWORD_ITEM_SEPARATOR_U
NICODE); | |
6114 } | |
6115 | |
6116 static void TestIsRightToLeft() { | |
6117 // API test only. More test cases in intltest/LocaleTest. | |
6118 if(uloc_isRightToLeft("root") || !uloc_isRightToLeft("EN-HEBR")) { | |
6119 log_err("uloc_isRightToLeft() failed"); | |
6120 } | |
6121 } | |
OLD | NEW |