]>
Commit | Line | Data |
---|---|---|
340931cb A |
1 | # © 2017 and later: Unicode, Inc. and others. |
2 | # License & terms of use: http://www.unicode.org/copyright.html#License | |
3 | # | |
4 | # Data-driven test for the language/locale matcher. | |
5 | # Format: | |
6 | # | |
7 | # Everything after "#" is a comment. | |
8 | # ** test: This line starts a group of test cases. | |
9 | # | |
10 | # Lines starting with an '@' sign provide matcher parameters. | |
11 | # @supported=<comma-separated supported languages> | |
12 | # @default=<default language> # no value = no explicit default | |
13 | # @favor=[normal|script] # no value = no explicit setting | |
14 | # @threshold=<number 0..100> # no value = no explicit setting | |
15 | # | |
16 | # A line with ">>" is a getBestMatch() test case: | |
17 | # <comma-separated desired languages> >> match | desired | combined | |
18 | # - match is the expected best supported language | |
19 | # - desired is the expected best desired language | |
20 | # - combined is the expected result of combine(match, desired) | |
21 | # An expected language can be "null" to check for the matcher returning null. | |
22 | # An empty or omitted value is not tested. (Omitted = not even the '|' separator.) | |
23 | # | |
24 | # ** test: A new test group resets all matcher parameters. | |
25 | ||
26 | ## X | |
27 | ||
28 | ** test: testParentLocales | |
29 | ||
30 | # es-419, es-AR, and es-MX are in a cluster; es is in a different one | |
31 | ||
32 | @supported=es-419, es-ES | |
33 | es-AR >> es-419 | |
34 | @supported=es-ES, es-419 | |
35 | es-AR >> es-419 | |
36 | ||
37 | @supported=es-419, es | |
38 | es-AR >> es-419 | |
39 | @supported=es, es-419 | |
40 | es-AR >> es-419 | |
41 | ||
42 | @supported=es-MX, es | |
43 | es-AR >> es-MX | |
44 | @supported=es, es-MX | |
45 | es-AR >> es-MX | |
46 | ||
47 | # en-GB, en-AU, and en-NZ are in a cluster; en in a different one | |
48 | ||
49 | @supported=en-GB, en-US | |
50 | en-AU >> en-GB | |
51 | @supported=en-US, en-GB | |
52 | en-AU >> en-GB | |
53 | ||
54 | @supported=en-GB, en | |
55 | en-AU >> en-GB | |
56 | @supported=en, en-GB | |
57 | en-AU >> en-GB | |
58 | ||
59 | @supported=en-NZ, en-US | |
60 | en-AU >> en-NZ | |
61 | @supported=en-US, en-NZ | |
62 | en-AU >> en-NZ | |
63 | ||
64 | @supported=en-NZ, en | |
65 | en-AU >> en-NZ | |
66 | @supported=en, en-NZ | |
67 | en-AU >> en-NZ | |
68 | ||
69 | # pt-AU and pt-PT in one cluster; pt-BR in another | |
70 | ||
71 | @supported=pt-PT, pt-BR | |
72 | pt-AO >> pt-PT | |
73 | @supported=pt-BR, pt-PT | |
74 | pt-AO >> pt-PT | |
75 | ||
76 | @supported=pt-PT, pt | |
77 | pt-AO >> pt-PT | |
78 | @supported=pt, pt-PT | |
79 | pt-AO >> pt-PT | |
80 | ||
81 | @supported=zh-MO, zh-TW | |
82 | zh-HK >> zh-MO | |
83 | @supported=zh-TW, zh-MO | |
84 | zh-HK >> zh-MO | |
85 | ||
86 | @supported=zh-MO, zh-CN | |
87 | zh-HK >> zh-MO | |
88 | @supported=zh-CN, zh-MO | |
89 | zh-HK >> zh-MO | |
90 | ||
91 | @supported=zh-MO, zh | |
92 | zh-HK >> zh-MO | |
93 | @supported=zh, zh-MO | |
94 | zh-HK >> zh-MO | |
95 | ||
96 | @favor=script | |
97 | @supported=es-419, es-ES | |
98 | es-AR >> es-419 | |
99 | @supported=es-ES, es-419 | |
100 | es-AR >> es-419 | |
101 | @supported=es-419, es | |
102 | es-AR >> es-419 | |
103 | @supported=es, es-419 | |
104 | es-AR >> es-419 | |
105 | @supported=es-MX, es | |
106 | es-AR >> es-MX | |
107 | @supported=es, es-MX | |
108 | es-AR >> es-MX | |
109 | @supported=en-GB, en-US | |
110 | en-AU >> en-GB | |
111 | @supported=en-US, en-GB | |
112 | en-AU >> en-GB | |
113 | @supported=en-GB, en | |
114 | en-AU >> en-GB | |
115 | @supported=en, en-GB | |
116 | en-AU >> en-GB | |
117 | @supported=en-NZ, en-US | |
118 | en-AU >> en-NZ | |
119 | @supported=en-US, en-NZ | |
120 | en-AU >> en-NZ | |
121 | @supported=en-NZ, en | |
122 | en-AU >> en-NZ | |
123 | @supported=en, en-NZ | |
124 | en-AU >> en-NZ | |
125 | @supported=pt-PT, pt-BR | |
126 | pt-AO >> pt-PT | |
127 | @supported=pt-BR, pt-PT | |
128 | pt-AO >> pt-PT | |
129 | @supported=pt-PT, pt | |
130 | pt-AO >> pt-PT | |
131 | @supported=pt, pt-PT | |
132 | pt-AO >> pt-PT | |
133 | @supported=zh-MO, zh-TW | |
134 | zh-HK >> zh-MO | |
135 | @supported=zh-TW, zh-MO | |
136 | zh-HK >> zh-MO | |
137 | @supported=zh-MO, zh-CN | |
138 | zh-HK >> zh-MO | |
139 | @supported=zh-CN, zh-MO | |
140 | zh-HK >> zh-MO | |
141 | @supported=zh-MO, zh | |
142 | zh-HK >> zh-MO | |
143 | @supported=zh, zh-MO | |
144 | zh-HK >> zh-MO | |
145 | ||
146 | ** test: testChinese | |
147 | ||
148 | @supported=zh-CN, zh-TW, iw | |
149 | zh-Hant-TW >> zh-TW | |
150 | zh-Hant >> zh-TW | |
151 | zh-TW >> zh-TW | |
152 | zh-Hans-CN >> zh-CN | |
153 | zh-CN >> zh-CN | |
154 | zh >> zh-CN | |
155 | ||
156 | @favor=script | |
157 | zh-Hant-TW >> zh-TW | |
158 | zh-Hant >> zh-TW | |
159 | zh-TW >> zh-TW | |
160 | zh-Hans-CN >> zh-CN | |
161 | zh-CN >> zh-CN | |
162 | zh >> zh-CN | |
163 | ||
164 | ** test: testenGB | |
165 | ||
166 | @supported=fr, en, en-GB, es-419, es-MX, es | |
167 | en-NZ >> en-GB | |
168 | es-ES >> es | |
169 | es-AR >> es-419 | |
170 | es-MX >> es-MX | |
171 | ||
172 | @favor=script | |
173 | en-NZ >> en-GB | |
174 | es-ES >> es | |
175 | es-AR >> es-419 | |
176 | es-MX >> es-MX | |
177 | ||
178 | ** test: testFallbacks | |
179 | ||
180 | @supported=91, en, hi | |
181 | sa >> hi | |
182 | ||
183 | @favor=script | |
184 | sa >> hi | |
185 | ||
186 | ** test: testBasics | |
187 | ||
188 | @supported=fr, en-GB, en | |
189 | en-GB >> en-GB | |
190 | en >> en | |
191 | fr >> fr | |
192 | ja >> fr # return first if no match | |
193 | ||
194 | @favor=script | |
195 | en-GB >> en-GB | |
196 | en >> en | |
197 | fr >> fr | |
198 | ja >> fr | |
199 | ||
200 | ** test: testFallback | |
201 | ||
202 | # check that script fallbacks are handled right | |
203 | ||
204 | @supported=zh-CN, zh-TW, iw | |
205 | zh-Hant >> zh-TW | |
206 | zh >> zh-CN | |
207 | zh-Hans-CN >> zh-CN | |
208 | zh-Hant-HK >> zh-TW | |
209 | he-IT >> iw | |
210 | ||
211 | @favor=script | |
212 | zh-Hant >> zh-TW | |
213 | zh >> zh-CN | |
214 | zh-Hans-CN >> zh-CN | |
215 | zh-Hant-HK >> zh-TW | |
216 | he-IT >> iw | |
217 | ||
218 | ** test: testSpecials | |
219 | ||
220 | # check that nearby languages are handled | |
221 | ||
222 | @supported=en, fil, ro, nn | |
223 | tl >> fil | |
224 | mo >> ro | |
225 | nb >> nn | |
226 | ||
227 | # make sure default works | |
228 | ||
229 | ja >> en | |
230 | ||
231 | @favor=script | |
232 | tl >> fil | |
233 | mo >> ro | |
234 | nb >> nn | |
235 | ja >> en | |
236 | ||
237 | ** test: testRegionalSpecials | |
238 | ||
239 | # verify that en-AU is closer to en-GB than to en (which is en-US) | |
240 | ||
241 | @supported=en, en-GB, es, es-419 | |
242 | es-MX >> es-419 | |
243 | en-AU >> en-GB | |
244 | es-ES >> es | |
245 | ||
246 | @favor=script | |
247 | es-MX >> es-419 | |
248 | en-AU >> en-GB | |
249 | es-ES >> es | |
250 | ||
251 | ** test: testHK | |
252 | ||
253 | # HK and MO are closer to each other for Hant than to TW | |
254 | ||
255 | @supported=zh, zh-TW, zh-MO | |
256 | zh-HK >> zh-MO | |
257 | @supported=zh, zh-TW, zh-HK | |
258 | zh-MO >> zh-HK | |
259 | ||
260 | @favor=script | |
261 | @supported=zh, zh-TW, zh-MO | |
262 | zh-HK >> zh-MO | |
263 | @supported=zh, zh-TW, zh-HK | |
264 | zh-MO >> zh-HK | |
265 | ||
266 | ** test: testMatch-matchOnMazimized | |
267 | ||
268 | @supported=zh, zh-Hant | |
269 | und-TW >> zh-Hant # und-TW should be closer to zh-Hant than to zh | |
270 | ||
271 | @supported=en-Hant-TW, und-TW | |
272 | zh-Hant >> und-TW # zh-Hant should be closer to und-TW than to en-Hant-TW | |
273 | zh >> und-TW # zh should be closer to und-TW than to en-Hant-TW | |
274 | ||
275 | @favor=script | |
276 | @supported=zh, zh-Hant | |
277 | und-TW >> zh-Hant | |
278 | @supported=en-Hant-TW, und-TW | |
279 | zh-Hant >> und-TW | |
280 | zh >> und-TW | |
281 | ||
282 | ** test: testMatchGrandfatheredCode | |
283 | ||
284 | @supported=fr, i-klingon, en-Latn-US | |
285 | en-GB-oed >> en-Latn-US | |
286 | ||
287 | @favor=script | |
288 | en-GB-oed >> en-Latn-US | |
289 | ||
290 | ** test: testGetBestMatchForList-exactMatch | |
291 | @supported=fr, en-GB, ja, es-ES, es-MX | |
292 | ja, de >> ja | |
293 | ||
294 | @favor=script | |
295 | ja, de >> ja | |
296 | ||
297 | ** test: testGetBestMatchForList-simpleVariantMatch | |
298 | @supported=fr, en-GB, ja, es-ES, es-MX | |
299 | de, en-US >> en-GB # Intentionally avoiding a perfect-match or two candidates for variant matches. | |
300 | ||
301 | # Fallback. | |
302 | ||
303 | de, zh >> fr | |
304 | ||
305 | @favor=script | |
306 | de, en-US >> en-GB | |
307 | de, zh >> fr | |
308 | ||
309 | ** test: testGetBestMatchForList-matchOnMaximized | |
310 | # Check that if the preference is maximized already, it works as well. | |
311 | ||
312 | @supported=en, ja | |
313 | ja-Jpan-JP, en-AU >> ja # Match for ja-Jpan-JP (maximized already) | |
314 | ||
315 | # ja-JP matches ja on likely subtags, and it's listed first, thus it wins over the second preference en-GB. | |
316 | ||
317 | ja-JP, en-US >> ja # Match for ja-Jpan-JP (maximized already) | |
318 | ||
319 | # Check that if the preference is maximized already, it works as well. | |
320 | ||
321 | ja-Jpan-JP, en-US >> ja # Match for ja-Jpan-JP (maximized already) | |
322 | ||
323 | @favor=script | |
324 | ja-Jpan-JP, en-AU >> ja | |
325 | ja-JP, en-US >> ja | |
326 | ja-Jpan-JP, en-US >> ja | |
327 | ||
328 | ** test: testGetBestMatchForList-noMatchOnMaximized | |
329 | # Regression test for http://b/5714572 . | |
330 | # de maximizes to de-DE. Pick the exact match for the secondary language instead. | |
331 | @supported=en, de, fr, ja | |
332 | de-CH, fr >> de | |
333 | ||
334 | @favor=script | |
335 | de-CH, fr >> de | |
336 | ||
337 | ** test: testBestMatchForTraditionalChinese | |
338 | ||
339 | # Scenario: An application that only supports Simplified Chinese (and some other languages), | |
340 | # but does not support Traditional Chinese. zh-Hans-CN could be replaced with zh-CN, zh, or | |
341 | # zh-Hans, it wouldn't make much of a difference. | |
342 | ||
343 | # The script distance (simplified vs. traditional Han) is considered small enough | |
344 | # to be an acceptable match. The regional difference is considered almost insignificant. | |
345 | ||
346 | @supported=fr, zh-Hans-CN, en-US | |
347 | zh-TW >> zh-Hans-CN | |
348 | zh-Hant >> zh-Hans-CN | |
349 | ||
350 | # For geopolitical reasons, you might want to avoid a zh-Hant -> zh-Hans match. | |
351 | # In this case, if zh-TW, zh-HK or a tag starting with zh-Hant is requested, you can | |
352 | # change your call to getBestMatch to include a 2nd language preference. | |
353 | # "en" is a better match since its distance to "en-US" is closer than the distance | |
354 | # from "zh-TW" to "zh-CN" (script distance). | |
355 | ||
356 | zh-TW, en >> en-US | |
357 | zh-Hant-CN, en >> en-US | |
358 | zh-Hans, en >> zh-Hans-CN | |
359 | ||
360 | @favor=script | |
361 | zh-TW >> zh-Hans-CN | |
362 | zh-Hant >> zh-Hans-CN | |
363 | zh-TW, en >> en-US | |
364 | zh-Hant-CN, en >> en-US | |
365 | zh-Hans, en >> zh-Hans-CN | |
366 | ||
367 | ** test: testUndefined | |
368 | # When the undefined language doesn't match anything in the list, | |
369 | # getBestMatch returns the default, as usual. | |
370 | ||
371 | @supported=it, fr | |
372 | und >> it | |
373 | ||
374 | # When it *does* occur in the list, bestMatch returns it, as expected. | |
375 | @supported=it, und | |
376 | und >> und | |
377 | ||
378 | # The unusual part: max("und") = "en-Latn-US", and since matching is based on maximized | |
379 | # tags, the undefined language would normally match English. But that would produce the | |
380 | # counterintuitive results that getBestMatch("und", XLocaleMatcher("it,en")) would be "en", and | |
381 | # getBestMatch("en", XLocaleMatcher("it,und")) would be "und". | |
382 | ||
383 | # To avoid that, we change the matcher's definitions of max | |
384 | # so that max("und")="und". That produces the following, more desirable | |
385 | # results: | |
386 | ||
387 | @supported=it, en | |
388 | # und >> it # Apple, get en | |
389 | @supported=it, und | |
390 | # en >> it # Apple, get und | |
391 | ||
392 | @favor=script | |
393 | @supported=it, fr | |
394 | und >> it | |
395 | @supported=it, und | |
396 | und >> und | |
397 | @supported=it, en | |
398 | # und >> it # Apple, get en | |
399 | @supported=it, und | |
400 | # en >> it # Apple, get und | |
401 | ||
402 | ** test: testGetBestMatch-regionDistance | |
403 | ||
404 | @supported=es-AR, es | |
405 | es-MX >> es-AR | |
406 | @supported=fr, en, en-GB | |
407 | en-CA >> en-GB | |
408 | @supported=de-AT, de-DE, de-CH | |
409 | de >> de-DE | |
410 | ||
411 | @favor=script | |
412 | @supported=es-AR, es | |
413 | es-MX >> es-AR | |
414 | @supported=fr, en, en-GB | |
415 | en-CA >> en-GB | |
416 | @supported=de-AT, de-DE, de-CH | |
417 | de >> de-DE | |
418 | ||
419 | ** test: testAsymmetry | |
420 | ||
421 | @supported=mul, nl | |
422 | af >> nl # af => nl | |
423 | @supported=mul, af | |
424 | nl >> mul # but nl !=> af | |
425 | ||
426 | @favor=script | |
427 | @supported=mul, nl | |
428 | af >> nl | |
429 | @supported=mul, af | |
430 | nl >> mul | |
431 | ||
432 | ** test: testGetBestMatchForList-matchOnMaximized2 | |
433 | ||
434 | # ja-JP matches ja on likely subtags, and it's listed first, thus it wins over the second preference en-GB. | |
435 | ||
436 | @supported=fr, en-GB, ja, es-ES, es-MX | |
437 | ja-JP, en-GB >> ja # Match for ja-JP, with likely region subtag | |
438 | ||
439 | # Check that if the preference is maximized already, it works as well. | |
440 | ||
441 | ja-Jpan-JP, en-GB >> ja # Match for ja-Jpan-JP (maximized already) | |
442 | ||
443 | @favor=script | |
444 | ja-JP, en-GB >> ja | |
445 | ja-Jpan-JP, en-GB >> ja | |
446 | ||
447 | ** test: testGetBestMatchForList-closeEnoughMatchOnMaximized | |
448 | ||
449 | @supported=en-GB, en, de, fr, ja | |
450 | de-CH, fr >> de | |
451 | en-US, ar, nl, de, ja >> en | |
452 | ||
453 | @favor=script | |
454 | de-CH, fr >> de | |
455 | en-US, ar, nl, de, ja >> en | |
456 | ||
457 | ** test: testGetBestMatchForPortuguese | |
458 | ||
459 | # pt might be supported and not pt-PT | |
460 | ||
461 | # European user who prefers Spanish over Brazilian Portuguese as a fallback. | |
462 | ||
463 | @supported=pt-PT, pt-BR, es, es-419 | |
464 | pt-PT, es, pt >> pt-PT | |
465 | @supported=pt-PT, pt, es, es-419 | |
466 | pt-PT, es, pt >> pt-PT # pt implicit | |
467 | ||
468 | # Brazilian user who prefers South American Spanish over European Portuguese as a fallback. | |
469 | # The asymmetry between this case and above is because it's "pt-PT" that's missing between the | |
470 | # matchers as "pt-BR" is a much more common language. | |
471 | ||
472 | @supported=pt-PT, pt-BR, es, es-419 | |
473 | pt, es-419, pt-PT >> pt-BR | |
474 | pt-PT, es, pt >> pt-PT | |
475 | @supported=pt-PT, pt, es, es-419 | |
476 | pt-PT, es, pt >> pt-PT | |
477 | pt, es-419, pt-PT >> pt | |
478 | ||
479 | @supported=pt-BR, es, es-419 | |
480 | pt, es-419, pt-PT >> pt-BR | |
481 | ||
482 | # Code that adds the user's country can get "pt-US" for a user's language. | |
483 | # That should fall back to "pt-BR". | |
484 | ||
485 | @supported=pt-PT, pt-BR, es, es-419 | |
486 | pt-US, pt-PT >> pt-BR | |
487 | @supported=pt-PT, pt, es, es-419 | |
488 | pt-US, pt-PT, pt >> pt # pt-BR implicit | |
489 | ||
490 | @favor=script | |
491 | @supported=pt-PT, pt-BR, es, es-419 | |
492 | pt-PT, es, pt >> pt-PT | |
493 | @supported=pt-PT, pt, es, es-419 | |
494 | pt-PT, es, pt >> pt-PT | |
495 | ||
496 | @supported=pt-PT, pt-BR, es, es-419 | |
497 | pt, es-419, pt-PT >> pt-BR | |
498 | pt-PT, es, pt >> pt-PT | |
499 | @supported=pt-PT, pt, es, es-419 | |
500 | pt-PT, es, pt >> pt-PT | |
501 | pt, es-419, pt-PT >> pt | |
502 | ||
503 | @supported=pt-BR, es, es-419 | |
504 | pt, es-419, pt-PT >> pt-BR | |
505 | ||
506 | @supported=pt-PT, pt-BR, es, es-419 | |
507 | pt-US, pt-PT >> pt-BR | |
508 | @supported=pt-PT, pt, es, es-419 | |
509 | pt-US, pt-PT, pt >> pt | |
510 | ||
511 | ** test: testVariantWithScriptMatch 1 and 2 | |
512 | ||
513 | @supported=fr, en, sv | |
514 | en-GB >> en | |
515 | @supported=en, sv | |
516 | en-GB, sv >> en | |
517 | ||
518 | @favor=script | |
519 | @supported=fr, en, sv | |
520 | en-GB >> en | |
521 | @supported=en, sv | |
522 | en-GB, sv >> en | |
523 | ||
524 | ** test: testLongLists | |
525 | ||
526 | @supported=en, sv | |
527 | sv >> sv | |
528 | ||
529 | @supported=af, am, ar, az, be, bg, bn, bs, ca, cs, cy, da, de, el, en, en-GB, es, es-419, et, eu, fa, fi, fil, fr, ga, gl, gu, hi, hr, hu, hy, id, is, it, iw, ja, ka, kk, km, kn, ko, ky, lo, lt, lv, mk, ml, mn, mr, ms, my, ne, nl, no, pa, pl, pt, pt-PT, ro, ru, si, sk, sl, sq, sr, sr-Latn, sv, sw, ta, te, th, tr, uk, ur, uz, vi, zh-CN, zh-TW, zu | |
530 | sv >> sv | |
531 | ||
532 | @supported=af, af-NA, af-ZA, agq, agq-CM, ak, ak-GH, am, am-ET, ar, ar-001, ar-AE, ar-BH, ar-DJ, ar-DZ, ar-EG, ar-EH, ar-ER, ar-IL, ar-IQ, ar-JO, ar-KM, ar-KW, ar-LB, ar-LY, ar-MA, ar-MR, ar-OM, ar-PS, ar-QA, ar-SA, ar-SD, ar-SO, ar-SS, ar-SY, ar-TD, ar-TN, ar-YE, as, as-IN, asa, asa-TZ, ast, ast-ES, az, az-Cyrl, az-Cyrl-AZ, az-Latn, az-Latn-AZ, bas, bas-CM, be, be-BY, bem, bem-ZM, bez, bez-TZ, bg, bg-BG, bm, bm-ML, bn, bn-BD, bn-IN, bo, bo-CN, bo-IN, br, br-FR, brx, brx-IN, bs, bs-Cyrl, bs-Cyrl-BA, bs-Latn, bs-Latn-BA, ca, ca-AD, ca-ES, ca-ES-VALENCIA, ca-FR, ca-IT, ce, ce-RU, cgg, cgg-UG, chr, chr-US, ckb, ckb-IQ, ckb-IR, cs, cs-CZ, cu, cu-RU, cy, cy-GB, da, da-DK, da-GL, dav, dav-KE, de, de-AT, de-BE, de-CH, de-DE, de-LI, de-LU, dje, dje-NE, dsb, dsb-DE, dua, dua-CM, dyo, dyo-SN, dz, dz-BT, ebu, ebu-KE, ee, ee-GH, ee-TG, el, el-CY, el-GR, en, en-001, en-150, en-AG, en-AI, en-AS, en-AT, en-AU, en-BB, en-BE, en-BI, en-BM, en-BS, en-BW, en-BZ, en-CA, en-CC, en-CH, en-CK, en-CM, en-CX, en-CY, en-DE, en-DG, en-DK, en-DM, en-ER, en-FI, en-FJ, en-FK, en-FM, en-GB, en-GD, en-GG, en-GH, en-GI, en-GM, en-GU, en-GY, en-HK, en-IE, en-IL, en-IM, en-IN, en-IO, en-JE, en-JM, en-KE, en-KI, en-KN, en-KY, en-LC, en-LR, en-LS, en-MG, en-MH, en-MO, en-MP, en-MS, en-MT, en-MU, en-MW, en-MY, en-NA, en-NF, en-NG, en-NL, en-NR, en-NU, en-NZ, en-PG, en-PH, en-PK, en-PN, en-PR, en-PW, en-RW, en-SB, en-SC, en-SD, en-SE, en-SG, en-SH, en-SI, en-SL, en-SS, en-SX, en-SZ, en-TC, en-TK, en-TO, en-TT, en-TV, en-TZ, en-UG, en-UM, en-US, en-US-POSIX, en-VC, en-VG, en-VI, en-VU, en-WS, en-ZA, en-ZM, en-ZW, eo, eo-001, es, es-419, es-AR, es-BO, es-CL, es-CO, es-CR, es-CU, es-DO, es-EA, es-EC, es-ES, es-GQ, es-GT, es-HN, es-IC, es-MX, es-NI, es-PA, es-PE, es-PH, es-PR, es-PY, es-SV, es-US, es-UY, es-VE, et, et-EE, eu, eu-ES, ewo, ewo-CM, fa, fa-AF, fa-IR, ff, ff-CM, ff-GN, ff-MR, ff-SN, fi, fi-FI, fil, fil-PH, fo, fo-DK, fo-FO, fr, fr-BE, fr-BF, fr-BI, fr-BJ, fr-BL, fr-CA, fr-CD, fr-CF, fr-CG, fr-CH, fr-CI, fr-CM, fr-DJ, fr-DZ, fr-FR, fr-GA, fr-GF, fr-GN, fr-GP, fr-GQ, fr-HT, fr-KM, fr-LU, fr-MA, fr-MC, fr-MF, fr-MG, fr-ML, fr-MQ, fr-MR, fr-MU, fr-NC, fr-NE, fr-PF, fr-PM, fr-RE, fr-RW, fr-SC, fr-SN, fr-SY, fr-TD, fr-TG, fr-TN, fr-VU, fr-WF, fr-YT, fur, fur-IT, fy, fy-NL, ga, ga-IE, gd, gd-GB, gl, gl-ES, gsw, gsw-CH, gsw-FR, gsw-LI, gu, gu-IN, guz, guz-KE, gv, gv-IM, ha, ha-GH, ha-NE, ha-NG, haw, haw-US, he, he-IL, hi, hi-IN, hr, hr-BA, hr-HR, hsb, hsb-DE, hu, hu-HU, hy, hy-AM, id, id-ID, ig, ig-NG, ii, ii-CN, is, is-IS, it, it-CH, it-IT, it-SM, ja, ja-JP, jgo, jgo-CM, jmc, jmc-TZ, ka, ka-GE, kab, kab-DZ, kam, kam-KE, kde, kde-TZ, kea, kea-CV, khq, khq-ML, ki, ki-KE, kk, kk-KZ, kkj, kkj-CM, kl, kl-GL, kln, kln-KE, km, km-KH, kn, kn-IN, ko, ko-KP, ko-KR, kok, kok-IN, ks, ks-IN, ksb, ksb-TZ, ksf, ksf-CM, ksh, ksh-DE, kw, kw-GB, ky, ky-KG, lag, lag-TZ, lb, lb-LU, lg, lg-UG, lkt, lkt-US, ln, ln-AO, ln-CD, ln-CF, ln-CG, lo, lo-LA, lrc, lrc-IQ, lrc-IR, lt, lt-LT, lu, lu-CD, luo, luo-KE, luy, luy-KE, lv, lv-LV, mas, mas-KE, mas-TZ, mer, mer-KE, mfe, mfe-MU, mg, mg-MG, mgh, mgh-MZ, mgo, mgo-CM, mk, mk-MK, ml, ml-IN, mn, mn-MN, mr, mr-IN, ms, ms-BN, ms-MY, ms-SG, mt, mt-MT, mua, mua-CM, my, my-MM, mzn, mzn-IR, naq, naq-NA, nb, nb-NO, nb-SJ, nd, nd-ZW, ne, ne-IN, ne-NP, nl, nl-AW, nl-BE, nl-BQ, nl-CW, nl-NL, nl-SR, nl-SX, nmg, nmg-CM, nn, nn-NO, nnh, nnh-CM, nus, nus-SS, nyn, nyn-UG, om, om-ET, om-KE, or, or-IN, os, os-GE, os-RU, pa, pa-Arab, pa-Arab-PK, pa-Guru, pa-Guru-IN, pl, pl-PL, prg, prg-001, ps, ps-AF, pt, pt-AO, pt-BR, pt-CV, pt-GW, pt-MO, pt-MZ, pt-PT, pt-ST, pt-TL, qu, qu-BO, qu-EC, qu-PE, rm, rm-CH, rn, rn-BI, ro, ro-MD, ro-RO, rof, rof-TZ, root, ru, ru-BY, ru-KG, ru-KZ, ru-MD, ru-RU, ru-UA, rw, rw-RW, rwk, rwk-TZ, sah, sah-RU, saq, saq-KE, sbp, sbp-TZ, se, se-FI, se-NO, se-SE, seh, seh-MZ, ses, ses-ML, sg, sg-CF, shi, shi-Latn, shi-Latn-MA, shi-Tfng, shi-Tfng-MA, si, si-LK, sk, sk-SK, sl, sl-SI, smn, smn-FI, sn, sn-ZW, so, so-DJ, so-ET, so-KE, so-SO, sq, sq-AL, sq-MK, sq-XK, sr, sr-Cyrl, sr-Cyrl-BA, sr-Cyrl-ME, sr-Cyrl-RS, sr-Cyrl-XK, sr-Latn, sr-Latn-BA, sr-Latn-ME, sr-Latn-RS, sr-Latn-XK, sv, sv-AX, sv-FI, sv-SE, sw, sw-CD, sw-KE, sw-TZ, sw-UG, ta, ta-IN, ta-LK, ta-MY, ta-SG, te, te-IN, teo, teo-KE, teo-UG, th, th-TH, ti, ti-ER, ti-ET, tk, tk-TM, to, to-TO, tr, tr-CY, tr-TR, twq, twq-NE, tzm, tzm-MA, ug, ug-CN, uk, uk-UA, ur, ur-IN, ur-PK, uz, uz-Arab, uz-Arab-AF, uz-Cyrl, uz-Cyrl-UZ, uz-Latn, uz-Latn-UZ, vai, vai-Latn, vai-Latn-LR, vai-Vaii, vai-Vaii-LR, vi, vi-VN, vo, vo-001, vun, vun-TZ, wae, wae-CH, xog, xog-UG, yav, yav-CM, yi, yi-001, yo, yo-BJ, yo-NG, zgh, zgh-MA, zh, zh-Hans, zh-Hans-CN, zh-Hans-HK, zh-Hans-MO, zh-Hans-SG, zh-Hant, zh-Hant-HK, zh-Hant-MO, zh-Hant-TW, zu, zu-ZA | |
533 | sv >> sv | |
534 | ||
535 | @favor=script | |
536 | @supported=en, sv | |
537 | sv >> sv | |
538 | ||
539 | @supported=af, am, ar, az, be, bg, bn, bs, ca, cs, cy, da, de, el, en, en-GB, es, es-419, et, eu, fa, fi, fil, fr, ga, gl, gu, hi, hr, hu, hy, id, is, it, iw, ja, ka, kk, km, kn, ko, ky, lo, lt, lv, mk, ml, mn, mr, ms, my, ne, nl, no, pa, pl, pt, pt-PT, ro, ru, si, sk, sl, sq, sr, sr-Latn, sv, sw, ta, te, th, tr, uk, ur, uz, vi, zh-CN, zh-TW, zu | |
540 | sv >> sv | |
541 | ||
542 | @supported=af, af-NA, af-ZA, agq, agq-CM, ak, ak-GH, am, am-ET, ar, ar-001, ar-AE, ar-BH, ar-DJ, ar-DZ, ar-EG, ar-EH, ar-ER, ar-IL, ar-IQ, ar-JO, ar-KM, ar-KW, ar-LB, ar-LY, ar-MA, ar-MR, ar-OM, ar-PS, ar-QA, ar-SA, ar-SD, ar-SO, ar-SS, ar-SY, ar-TD, ar-TN, ar-YE, as, as-IN, asa, asa-TZ, ast, ast-ES, az, az-Cyrl, az-Cyrl-AZ, az-Latn, az-Latn-AZ, bas, bas-CM, be, be-BY, bem, bem-ZM, bez, bez-TZ, bg, bg-BG, bm, bm-ML, bn, bn-BD, bn-IN, bo, bo-CN, bo-IN, br, br-FR, brx, brx-IN, bs, bs-Cyrl, bs-Cyrl-BA, bs-Latn, bs-Latn-BA, ca, ca-AD, ca-ES, ca-ES-VALENCIA, ca-FR, ca-IT, ce, ce-RU, cgg, cgg-UG, chr, chr-US, ckb, ckb-IQ, ckb-IR, cs, cs-CZ, cu, cu-RU, cy, cy-GB, da, da-DK, da-GL, dav, dav-KE, de, de-AT, de-BE, de-CH, de-DE, de-LI, de-LU, dje, dje-NE, dsb, dsb-DE, dua, dua-CM, dyo, dyo-SN, dz, dz-BT, ebu, ebu-KE, ee, ee-GH, ee-TG, el, el-CY, el-GR, en, en-001, en-150, en-AG, en-AI, en-AS, en-AT, en-AU, en-BB, en-BE, en-BI, en-BM, en-BS, en-BW, en-BZ, en-CA, en-CC, en-CH, en-CK, en-CM, en-CX, en-CY, en-DE, en-DG, en-DK, en-DM, en-ER, en-FI, en-FJ, en-FK, en-FM, en-GB, en-GD, en-GG, en-GH, en-GI, en-GM, en-GU, en-GY, en-HK, en-IE, en-IL, en-IM, en-IN, en-IO, en-JE, en-JM, en-KE, en-KI, en-KN, en-KY, en-LC, en-LR, en-LS, en-MG, en-MH, en-MO, en-MP, en-MS, en-MT, en-MU, en-MW, en-MY, en-NA, en-NF, en-NG, en-NL, en-NR, en-NU, en-NZ, en-PG, en-PH, en-PK, en-PN, en-PR, en-PW, en-RW, en-SB, en-SC, en-SD, en-SE, en-SG, en-SH, en-SI, en-SL, en-SS, en-SX, en-SZ, en-TC, en-TK, en-TO, en-TT, en-TV, en-TZ, en-UG, en-UM, en-US, en-US-POSIX, en-VC, en-VG, en-VI, en-VU, en-WS, en-ZA, en-ZM, en-ZW, eo, eo-001, es, es-419, es-AR, es-BO, es-CL, es-CO, es-CR, es-CU, es-DO, es-EA, es-EC, es-ES, es-GQ, es-GT, es-HN, es-IC, es-MX, es-NI, es-PA, es-PE, es-PH, es-PR, es-PY, es-SV, es-US, es-UY, es-VE, et, et-EE, eu, eu-ES, ewo, ewo-CM, fa, fa-AF, fa-IR, ff, ff-CM, ff-GN, ff-MR, ff-SN, fi, fi-FI, fil, fil-PH, fo, fo-DK, fo-FO, fr, fr-BE, fr-BF, fr-BI, fr-BJ, fr-BL, fr-CA, fr-CD, fr-CF, fr-CG, fr-CH, fr-CI, fr-CM, fr-DJ, fr-DZ, fr-FR, fr-GA, fr-GF, fr-GN, fr-GP, fr-GQ, fr-HT, fr-KM, fr-LU, fr-MA, fr-MC, fr-MF, fr-MG, fr-ML, fr-MQ, fr-MR, fr-MU, fr-NC, fr-NE, fr-PF, fr-PM, fr-RE, fr-RW, fr-SC, fr-SN, fr-SY, fr-TD, fr-TG, fr-TN, fr-VU, fr-WF, fr-YT, fur, fur-IT, fy, fy-NL, ga, ga-IE, gd, gd-GB, gl, gl-ES, gsw, gsw-CH, gsw-FR, gsw-LI, gu, gu-IN, guz, guz-KE, gv, gv-IM, ha, ha-GH, ha-NE, ha-NG, haw, haw-US, he, he-IL, hi, hi-IN, hr, hr-BA, hr-HR, hsb, hsb-DE, hu, hu-HU, hy, hy-AM, id, id-ID, ig, ig-NG, ii, ii-CN, is, is-IS, it, it-CH, it-IT, it-SM, ja, ja-JP, jgo, jgo-CM, jmc, jmc-TZ, ka, ka-GE, kab, kab-DZ, kam, kam-KE, kde, kde-TZ, kea, kea-CV, khq, khq-ML, ki, ki-KE, kk, kk-KZ, kkj, kkj-CM, kl, kl-GL, kln, kln-KE, km, km-KH, kn, kn-IN, ko, ko-KP, ko-KR, kok, kok-IN, ks, ks-IN, ksb, ksb-TZ, ksf, ksf-CM, ksh, ksh-DE, kw, kw-GB, ky, ky-KG, lag, lag-TZ, lb, lb-LU, lg, lg-UG, lkt, lkt-US, ln, ln-AO, ln-CD, ln-CF, ln-CG, lo, lo-LA, lrc, lrc-IQ, lrc-IR, lt, lt-LT, lu, lu-CD, luo, luo-KE, luy, luy-KE, lv, lv-LV, mas, mas-KE, mas-TZ, mer, mer-KE, mfe, mfe-MU, mg, mg-MG, mgh, mgh-MZ, mgo, mgo-CM, mk, mk-MK, ml, ml-IN, mn, mn-MN, mr, mr-IN, ms, ms-BN, ms-MY, ms-SG, mt, mt-MT, mua, mua-CM, my, my-MM, mzn, mzn-IR, naq, naq-NA, nb, nb-NO, nb-SJ, nd, nd-ZW, ne, ne-IN, ne-NP, nl, nl-AW, nl-BE, nl-BQ, nl-CW, nl-NL, nl-SR, nl-SX, nmg, nmg-CM, nn, nn-NO, nnh, nnh-CM, nus, nus-SS, nyn, nyn-UG, om, om-ET, om-KE, or, or-IN, os, os-GE, os-RU, pa, pa-Arab, pa-Arab-PK, pa-Guru, pa-Guru-IN, pl, pl-PL, prg, prg-001, ps, ps-AF, pt, pt-AO, pt-BR, pt-CV, pt-GW, pt-MO, pt-MZ, pt-PT, pt-ST, pt-TL, qu, qu-BO, qu-EC, qu-PE, rm, rm-CH, rn, rn-BI, ro, ro-MD, ro-RO, rof, rof-TZ, root, ru, ru-BY, ru-KG, ru-KZ, ru-MD, ru-RU, ru-UA, rw, rw-RW, rwk, rwk-TZ, sah, sah-RU, saq, saq-KE, sbp, sbp-TZ, se, se-FI, se-NO, se-SE, seh, seh-MZ, ses, ses-ML, sg, sg-CF, shi, shi-Latn, shi-Latn-MA, shi-Tfng, shi-Tfng-MA, si, si-LK, sk, sk-SK, sl, sl-SI, smn, smn-FI, sn, sn-ZW, so, so-DJ, so-ET, so-KE, so-SO, sq, sq-AL, sq-MK, sq-XK, sr, sr-Cyrl, sr-Cyrl-BA, sr-Cyrl-ME, sr-Cyrl-RS, sr-Cyrl-XK, sr-Latn, sr-Latn-BA, sr-Latn-ME, sr-Latn-RS, sr-Latn-XK, sv, sv-AX, sv-FI, sv-SE, sw, sw-CD, sw-KE, sw-TZ, sw-UG, ta, ta-IN, ta-LK, ta-MY, ta-SG, te, te-IN, teo, teo-KE, teo-UG, th, th-TH, ti, ti-ER, ti-ET, tk, tk-TM, to, to-TO, tr, tr-CY, tr-TR, twq, twq-NE, tzm, tzm-MA, ug, ug-CN, uk, uk-UA, ur, ur-IN, ur-PK, uz, uz-Arab, uz-Arab-AF, uz-Cyrl, uz-Cyrl-UZ, uz-Latn, uz-Latn-UZ, vai, vai-Latn, vai-Latn-LR, vai-Vaii, vai-Vaii-LR, vi, vi-VN, vo, vo-001, vun, vun-TZ, wae, wae-CH, xog, xog-UG, yav, yav-CM, yi, yi-001, yo, yo-BJ, yo-NG, zgh, zgh-MA, zh, zh-Hans, zh-Hans-CN, zh-Hans-HK, zh-Hans-MO, zh-Hans-SG, zh-Hant, zh-Hant-HK, zh-Hant-MO, zh-Hant-TW, zu, zu-ZA | |
543 | sv >> sv | |
544 | ||
545 | ** test: test8288 | |
546 | ||
547 | @supported=it, en | |
548 | # und >> it # Apple, get en | |
549 | und, en >> en | |
550 | ||
551 | # examples from | |
552 | # http://unicode.org/repos/cldr/tags/latest/common/bcp47/ | |
553 | # http://unicode.org/repos/cldr/tags/latest/common/validity/variant.xml | |
554 | ||
555 | @favor=script | |
556 | # und >> it # Apple, get en | |
557 | und, en >> en | |
558 | ||
559 | ** test: testUnHack | |
560 | ||
561 | @supported=en-NZ, en-IT | |
562 | en-US >> en-NZ | |
563 | ||
564 | @favor=script | |
565 | en-US >> en-NZ | |
566 | ||
567 | ** test: testEmptySupported => null | |
568 | en >> null | |
569 | ||
570 | # testVariantsAndExtensions | |
571 | ||
572 | ** test: tests the .combine() method | |
573 | ||
574 | @supported=und, fr | |
575 | fr-BE-fonipa >> fr | | fr-BE-fonipa | |
576 | @supported=und, fr-CA | |
577 | fr-BE-fonipa >> fr-CA | | fr-BE-fonipa | |
578 | @supported=und, fr-fonupa | |
579 | fr-BE-fonipa >> fr-fonupa | | fr-BE-fonipa | |
580 | @supported=und, no | |
581 | nn-BE-fonipa >> no | | no-BE-fonipa | |
582 | @supported=und, en-GB-u-sd-gbsct | |
583 | # en-fonipa-u-nu-Arab-ca-buddhist-t-m0-iso-i0-pinyin >> en-GB-u-sd-gbsct | | en-GB-fonipa-u-nu-Arab-ca-buddhist-t-m0-iso-i0-pinyin # Apple, get und | |
584 | ||
585 | @supported=en-PSCRACK, de-PSCRACK, fr-PSCRACK, pt-PT-PSCRACK | |
586 | fr-PSCRACK >> fr-PSCRACK | |
587 | fr >> en-PSCRACK | |
588 | de-CH >> en-PSCRACK | |
589 | ||
590 | @favor=script | |
591 | @supported=und, fr | |
592 | fr-BE-fonipa >> fr | |
593 | @supported=und, fr-CA | |
594 | fr-BE-fonipa >> fr-CA | |
595 | @supported=und, fr-fonupa | |
596 | fr-BE-fonipa >> fr-fonupa | |
597 | @supported=und, no | |
598 | nn-BE-fonipa >> no | | no-BE-fonipa | |
599 | @supported=und, en-GB-u-sd-gbsct | |
600 | # en-fonipa-u-nu-Arab-ca-buddhist-t-m0-iso-i0-pinyin >> en-GB-u-sd-gbsct | | en-GB-fonipa-u-nu-Arab-ca-buddhist-t-m0-iso-i0-pinyin # Apple, get und | |
601 | ||
602 | @supported=en-PSCRACK, de-PSCRACK, fr-PSCRACK, pt-PT-PSCRACK | |
603 | fr-PSCRACK >> fr-PSCRACK | |
604 | fr >> en-PSCRACK | |
605 | de-CH >> en-PSCRACK | |
606 | ||
607 | ** test: testClusters | |
608 | # we favor es-419 over others in cluster. Clusters: es- {ES, MA, EA} {419, AR, MX} | |
609 | ||
610 | @supported=und, es, es-MA, es-MX, es-419 | |
611 | es-AR >> es-419 | |
612 | @supported=und, es-MA, es, es-419, es-MX | |
613 | es-AR >> es-419 | |
614 | @supported=und, es, es-MA, es-MX, es-419 | |
615 | es-EA >> es | |
616 | @supported=und, es-MA, es, es-419, es-MX | |
617 | es-EA >> es | |
618 | ||
619 | # of course, fall back to within cluster | |
620 | ||
621 | @supported=und, es, es-MA, es-MX | |
622 | es-AR >> es-MX | |
623 | @supported=und, es-MA, es, es-MX | |
624 | es-AR >> es-MX | |
625 | @supported=und, es-MA, es-MX, es-419 | |
626 | es-EA >> es-MA | |
627 | @supported=und, es-MA, es-419, es-MX | |
628 | es-EA >> es-MA | |
629 | ||
630 | # we favor es-GB over others in cluster. Clusters: en- {US, GU, VI} {GB, IN, ZA} | |
631 | ||
632 | @supported=und, en, en-GU, en-IN, en-GB | |
633 | en-ZA >> en-GB | |
634 | @supported=und, en-GU, en, en-GB, en-IN | |
635 | en-ZA >> en-GB | |
636 | @supported=und, en, en-GU, en-IN, en-GB | |
637 | # en-VI >> en # Apple, get und | |
638 | @supported=und, en-GU, en, en-GB, en-IN | |
639 | # en-VI >> en # Apple, get und | |
640 | ||
641 | # of course, fall back to within cluster | |
642 | ||
643 | @supported=und, en, en-GU, en-IN | |
644 | en-ZA >> en-IN | |
645 | @supported=und, en-GU, en, en-IN | |
646 | en-ZA >> en-IN | |
647 | @supported=und, en-GU, en-IN, en-GB | |
648 | # en-VI >> en-GU # Apple, get und | |
649 | @supported=und, en-GU, en-GB, en-IN | |
650 | # en-VI >> en-GU # Apple, get und | |
651 | ||
652 | @favor=script | |
653 | @supported=und, es, es-MA, es-MX, es-419 | |
654 | es-AR >> es-419 | |
655 | @supported=und, es-MA, es, es-419, es-MX | |
656 | es-AR >> es-419 | |
657 | @supported=und, es, es-MA, es-MX, es-419 | |
658 | es-EA >> es | |
659 | @supported=und, es-MA, es, es-419, es-MX | |
660 | es-EA >> es | |
661 | ||
662 | @supported=und, es, es-MA, es-MX | |
663 | es-AR >> es-MX | |
664 | @supported=und, es-MA, es, es-MX | |
665 | es-AR >> es-MX | |
666 | @supported=und, es-MA, es-MX, es-419 | |
667 | es-EA >> es-MA | |
668 | @supported=und, es-MA, es-419, es-MX | |
669 | es-EA >> es-MA | |
670 | ||
671 | @supported=und, en, en-GU, en-IN, en-GB | |
672 | en-ZA >> en-GB | |
673 | @supported=und, en-GU, en, en-GB, en-IN | |
674 | en-ZA >> en-GB | |
675 | @supported=und, en, en-GU, en-IN, en-GB | |
676 | # en-VI >> en # Apple, get und | |
677 | @supported=und, en-GU, en, en-GB, en-IN | |
678 | # en-VI >> en # Apple, get und | |
679 | ||
680 | @supported=und, en, en-GU, en-IN | |
681 | en-ZA >> en-IN | |
682 | @supported=und, en-GU, en, en-IN | |
683 | en-ZA >> en-IN | |
684 | @supported=und, en-GU, en-IN, en-GB | |
685 | # en-VI >> en-GU # Apple, get und | |
686 | @supported=und, en-GU, en-GB, en-IN | |
687 | # en-VI >> en-GU # Apple, get und | |
688 | ||
689 | ** test: testThreshold | |
690 | @supported=50, und, fr-CA-fonupa | |
691 | @threshold=60 | |
692 | fr-BE-fonipa >> fr-CA-fonupa | | fr-BE-fonipa | |
693 | @supported=und, fr-Cyrl-CA-fonupa | |
694 | fr-BE-fonipa >> fr-Cyrl-CA-fonupa | | fr-Cyrl-BE-fonipa | |
695 | @threshold=50 | |
696 | fr-BE-fonipa >> und | |
697 | ||
698 | @favor=script | |
699 | @supported=50, und, fr-CA-fonupa | |
700 | @threshold= | |
701 | fr-BE-fonipa >> fr-CA-fonupa | | fr-BE-fonipa | |
702 | @supported=und, fr-Cyrl-CA-fonupa | |
703 | fr-BE-fonipa >> und | |
704 | ||
705 | ** test: testScriptFirst | |
706 | @supported=ru, fr | |
707 | zh, pl >> ru | |
708 | zh-Cyrl, pl >> ru | |
709 | @supported=hr, en-Cyrl | |
710 | sr >> hr | |
711 | @supported=da, ru, hr | |
712 | sr >> da | |
713 | ||
714 | @favor=script | |
715 | @supported=ru, fr | |
716 | zh, pl >> fr | |
717 | zh-Cyrl, pl >> ru | |
718 | @supported=hr, en-Cyrl | |
719 | sr >> en-Cyrl | |
720 | @supported=da, ru, hr | |
721 | sr >> ru | |
722 | ||
723 | ## III | |
724 | ||
725 | ** test: testBasicsWithDefault | |
726 | @supported=en-GB, en | |
727 | @default=fr | |
728 | en-GB >> en-GB | |
729 | en-US >> en | |
730 | fr >> fr | |
731 | ja >> fr | |
732 | ||
733 | @favor=script | |
734 | en-GB >> en-GB | |
735 | en-US >> en | |
736 | fr >> en-GB | |
737 | ja >> fr | |
738 | ||
739 | ** test: testEmptyWithDefault | |
740 | @default=en | |
741 | fr >> en | |
742 | ||
743 | ** test: testGetBestMatchForList_exactMatch | |
744 | @supported=fr, en-GB, ja, es-ES, es-MX | |
745 | ja, de >> ja | |
746 | ||
747 | ** test: testGetBestMatchForList_simpleVariantMatch | |
748 | # Intentionally avoiding a perfect-match or two candidates for variant matches. | |
749 | @supported=fr, en-GB, ja, es-ES, es-MX | |
750 | de, en-US >> en-GB | |
751 | # Fall back. | |
752 | de, zh >> fr | |
753 | ||
754 | ** test: TestEuHack | |
755 | @supported=en-NZ, en-IT | |
756 | en-US >> en-NZ | |
757 | ||
758 | ** test: TestBasics | |
759 | @supported=fr, en-GB, en | |
760 | en-GB >> en-GB | |
761 | en-US >> en | |
762 | fr-FR >> fr | |
763 | ja-JP >> fr | |
764 | # For a language that doesn't match anything, return the default. | |
765 | zu >> en-GB | |
766 | zxx >> fr | |
767 | ||
768 | @favor=script | |
769 | en-GB >> en-GB | |
770 | en-US >> en | |
771 | fr-FR >> fr | |
772 | ja-JP >> fr | |
773 | zu >> en-GB | |
774 | zxx >> en | |
775 | ||
776 | ** test: TestExactMatch | |
777 | @supported=fr, en-GB, ja, es-ES, es-MX | |
778 | ja, de >> ja | |
779 | ||
780 | ** test: TestSimpleVariantMatch | |
781 | @supported=fr, en-GB, ja, es-ES, es-MX | |
782 | de, en-US >> en-GB | |
783 | de, zh >> fr | |
784 | ||
785 | ** test: TestMatchOnMaximized | |
786 | # ja-JP matches ja on likely subtags, and it's listed first, thus it wins | |
787 | # over the secondary preference en-GB. | |
788 | @supported=fr, en-GB, ja, es-ES, es-MX | |
789 | ja-JP, en-GB >> ja | |
790 | # Check that if the preference is maximized already, it works as well. | |
791 | ja-Jpan-JP, en-GB >> ja | |
792 | @supported=fr, zh-Hant, en | |
793 | zh, en >> en | |
794 | ||
795 | @favor=script | |
796 | zh, en >> en | |
797 | ||
798 | ** test: TestCloseEnoughMatchOnMaximized | |
799 | @supported=en-GB, en, de, fr, ja | |
800 | de-CH, fr >> de | |
801 | en-US, ar, nl, de, ja >> en | |
802 | ||
803 | ** test: TestGetBestMatchForPortuguese | |
804 | # 1. a supported set containing an explicit pt: {pt-PT, pt-BR, es, es-419} | |
805 | # 2. a supported set containing an implicit pt: {pt-PT, pt, es, es-419} | |
806 | # 3. a supported set containing no pt: {pt-BR, es, es-419} | |
807 | # European user who prefers Spanish over Brazilian Portuguese as a fallback. | |
808 | @supported=pt-PT, pt-BR, es, es-419 | |
809 | pt-PT, es, pt >> pt-PT | |
810 | @supported=pt-PT, pt, es, es-419 | |
811 | pt-PT, es, pt >> pt-PT | |
812 | @supported=pt-BR, es, es-419 | |
813 | pt-PT, es, pt >> pt-BR | |
814 | ||
815 | # Brazilian user who prefers South American Spanish over European Portuguese | |
816 | # as a fallback. The asymmetry between this case and above is because it's | |
817 | # "pt-PT" that's missing between the matchers. | |
818 | @supported=pt-PT, pt-BR, es, es-419 | |
819 | pt, es-419, pt-PT >> pt-BR | |
820 | @supported=pt-PT, pt, es, es-419 | |
821 | pt, es-419, pt-PT >> pt | |
822 | @supported=pt-BR, es, es-419 | |
823 | pt, es-419, pt-PT >> pt-BR | |
824 | ||
825 | # Sometimes we get "pt-US" for a user's language (which CLDR doesn't | |
826 | # recognize) but we deal with that as a synonym for "pt-BR". | |
827 | @supported=pt-PT, pt-BR, es, es-419 | |
828 | pt-US, pt-PT >> pt-BR | |
829 | @supported=pt-PT, pt, es, es-419 | |
830 | pt-US, pt-PT >> pt | |
831 | ||
832 | @favor=script | |
833 | @supported=pt-BR, es, es-419 | |
834 | pt-PT, es, pt >> pt-BR | |
835 | @supported=pt-PT, pt, es, es-419 | |
836 | pt-US, pt-PT >> pt | |
837 | ||
838 | ** test: TestScriptAndRegion | |
839 | @supported=en-GB, en | |
840 | en-CA >> en-GB | |
841 | # fr-CA is a "close enough" match to "fr" to be returned in favor of "en-GB" | |
842 | @supported=fr, en-GB, en | |
843 | fr-CA, en-CA >> fr | |
844 | @supported=zh-Hant, zh-TW | |
845 | zh-HK >> zh-Hant | |
846 | ||
847 | @favor=script | |
848 | @supported=en-GB, en | |
849 | en-CA >> en-GB | |
850 | @supported=fr, en-GB, en | |
851 | fr-CA, en-CA >> fr | |
852 | @supported=zh-Hant, zh-TW | |
853 | zh-HK >> zh-Hant | |
854 | ||
855 | ** test: TestFallback | |
856 | @supported=zh-CN, zh-TW, iw | |
857 | zh-Hant >> zh-TW | |
858 | zh >> zh-CN | |
859 | zh-Hans-CN >> zh-CN | |
860 | zh-Hant-HK >> zh-TW | |
861 | he-IT >> iw | |
862 | ||
863 | ** test: TestFallbackWithDefault | |
864 | # Check that script fallbacks are handled right and that we don't have to | |
865 | # fall back to the default. | |
866 | @supported=zh-CN, zh-TW, iw | |
867 | @default=fr | |
868 | zh-Hant >> zh-TW | |
869 | zh >> zh-CN | |
870 | zh-Hans-CN >> zh-CN | |
871 | zh-Hant-HK >> zh-TW | |
872 | he-IT >> iw | |
873 | ||
874 | @favor=script | |
875 | zh-Hant >> zh-TW | |
876 | zh >> zh-CN | |
877 | zh-Hans-CN >> zh-CN | |
878 | zh-Hant-HK >> zh-TW | |
879 | he-IT >> iw | |
880 | ||
881 | ** test: TestSpecials | |
882 | # Check that nearby languages are handled. | |
883 | @supported=en, fil, ro, nn | |
884 | tl >> fil | |
885 | mo >> ro | |
886 | nb >> nn | |
887 | ja >> en # Make sure default works. | |
888 | ||
889 | ** test: TestRegionalSpecials | |
890 | # Verify that en-AU is closer to en-GB than to en (which is en-US). | |
891 | @supported=en, en-GB, es-ES, es-419 | |
892 | en-AU >> en-GB | |
893 | # Following 2 cases test closer/smaller region difference. | |
894 | es-MX >> es-419 | |
895 | es-PT >> es-ES | |
896 | ||
897 | @favor=script | |
898 | en-AU >> en-GB | |
899 | es-MX >> es-419 | |
900 | es-PT >> es-ES | |
901 | ||
902 | ** test: TestEmpty | |
903 | fr >> null | |
904 | ||
905 | ** test: TestUndefined | |
906 | # When the undefined language doesn't match anything in the list, | |
907 | # return the default. | |
908 | @supported=it, fr | |
909 | und >> it | |
910 | # When it *does* occur in the list, return it. | |
911 | @supported=it, und | |
912 | und >> und | |
913 | # The unusual part: | |
914 | # max("und") = "en-Latn-US", and since matching is based on | |
915 | # maximized tags, the undefined language would normally match | |
916 | # English. But that would produce the counterintuitive results | |
917 | # that BestMatchFor("und", LanguageMatcher("it,en")) would be "en", | |
918 | # and BestMatchFor("en", LanguageMatcher("it,und")) would be "und". | |
919 | ||
920 | # To avoid that, we change the matcher's definitions of max | |
921 | # (AddLikelySubtagsWithDefaults) so that max("und")="und". That | |
922 | # produces the following, more desirable results: | |
923 | @supported=it, en | |
924 | # und >> it # Apple, get en | |
925 | @supported=it, und | |
926 | # en >> it # Apple, get und | |
927 | ||
928 | ** test: TestVariantWithScriptMatch | |
929 | @supported=fr, en, sv | |
930 | en-GB >> en | |
931 | en-GB, sv >> en | |
932 | ||
933 | @favor=script | |
934 | en-GB, sv >> en | |
935 | ||
936 | ** test: Serbian | |
937 | @supported=und, sr | |
938 | sr-ME >> sr | |
939 | @supported=und, sr-ME | |
940 | sr >> sr-ME | |
941 | @supported=und, sr-Latn | |
942 | bs >> und | |
943 | @supported=und, bs | |
944 | sr-Latn >> und | |
945 | @supported=und, sr | |
946 | bs >> und | |
947 | @supported=und, bs | |
948 | sr >> und | |
949 | @supported=und, sr-Latn | |
950 | sr >> sr-Latn | |
951 | @supported=und, sr | |
952 | sr-Latn >> sr | |
953 | ||
954 | @favor=script | |
955 | sr-ME >> sr | |
956 | @supported=und, sr-ME | |
957 | sr >> sr-ME | |
958 | @supported=und, sr-Latn | |
959 | # bs >> sr-Latn # Apple, get und | |
960 | @supported=und, bs | |
961 | # sr-Latn >> bs # Apple, get und | |
962 | @supported=und, sr | |
963 | bs >> und | |
964 | @supported=und, bs | |
965 | sr >> und | |
966 | @supported=und, sr-Latn | |
967 | sr >> sr-Latn | |
968 | @supported=und, sr | |
969 | sr-Latn >> sr | |
970 | ||
971 | ** test: MatchGooglePrivateUseSubtag | |
972 | @supported=fr, x-bork, en-Latn-US | |
973 | x-piglatin >> fr | |
974 | x-bork >> x-bork | |
975 | @supported=fr, en-GB, x-bork, es-ES, es-419 | |
976 | x-piglatin >> fr | |
977 | x-bork >> x-bork | |
978 | ||
979 | @favor=script | |
980 | @supported=fr, x-bork, en-Latn-US | |
981 | x-piglatin >> x-bork | |
982 | x-bork >> x-bork | |
983 | @supported=fr, en-GB, x-bork, es-ES, es-419 | |
984 | x-piglatin >> x-bork | |
985 | x-bork >> x-bork | |
986 | ||
987 | ** test: MatchGrandfatheredCode | |
988 | @supported=fr, i-klingon, en-Latn-US | |
989 | en-GB-oed >> en-Latn-US | |
990 | i-klingon >> tlh | |
991 | ||
992 | @favor=script | |
993 | en-GB-oed >> en-Latn-US | |
994 | i-klingon >> tlh | |
995 | ||
996 | ** test: MatchGooglePseudoLocale | |
997 | # Google pseudo locales using variant subtags. | |
998 | # (See below for the region code based pseudo locales.) | |
999 | @supported=fr, en-PSACCENT, ar-PSBIDI, en-PSCRACK, zh-Hans-PSCRACK, pt-PT-PSCRACK, pt | |
1000 | de >> fr | |
1001 | en-US >> fr | |
1002 | en >> fr | |
1003 | ar-PSBIDI >> ar-PSBIDI | |
1004 | en-PSACCENT >> en-PSACCENT | |
1005 | en-PSCRACK >> en-PSCRACK | |
1006 | pt-BR >> pt | |
1007 | pt-PT-PSCRACK >> pt-PT-PSCRACK | |
1008 | zh-Hans-PSCRACK >> zh-Hans-PSCRACK | |
1009 | ||
1010 | @favor=script | |
1011 | de >> fr | |
1012 | en-US >> fr | |
1013 | en >> fr | |
1014 | ar-PSBIDI >> ar-PSBIDI | |
1015 | en-PSACCENT >> en-PSACCENT | |
1016 | en-PSCRACK >> en-PSCRACK | |
1017 | pt-BR >> pt | |
1018 | pt-PT-PSCRACK >> pt-PT-PSCRACK | |
1019 | zh-Hans-PSCRACK >> zh-Hans-PSCRACK | |
1020 | ||
1021 | ** test: MatchGooglePseudoLocaleWithFallbacks | |
1022 | # Pseudo locales based on the fall back option (XA..XC region codes). | |
1023 | @supported=fr, en-XA, ar-XB, en-XC, zh-Hans-XC, pt | |
1024 | de >> fr | |
1025 | en-US >> fr | |
1026 | en >> fr | |
1027 | ar-XB >> ar-XB | |
1028 | en-XA >> en-XA | |
1029 | en-XC >> en-XC | |
1030 | pt-BR >> pt | |
1031 | zh-Hans-XC >> zh-Hans-XC | |
1032 | ||
1033 | @favor=script | |
1034 | de >> fr | |
1035 | en-US >> fr | |
1036 | en >> fr | |
1037 | ar-XB >> ar-XB | |
1038 | en-XA >> en-XA | |
1039 | en-XC >> en-XC | |
1040 | pt-BR >> pt | |
1041 | zh-Hans-XC >> zh-Hans-XC | |
1042 | ||
1043 | ** test: DoNotMatchGooglePseudoLocale | |
1044 | @supported=fr, en-XA, ar-XB, en-PSACCENT, ar-PSBIDI, en-DE, pt, ar-SY, ar-PSCRACK | |
1045 | de >> fr | |
1046 | # We wouldn't want to return pseudo locales when there's a good match for an | |
1047 | # ordinary locale. | |
1048 | # Note: If LanguageMatcher was not aware of PSACCENT, it would consider the | |
1049 | # distance from "en" to "en-PSACCENT" smaller than to "en-DE" (the standard | |
1050 | # variant distance is smaller than a region distance). | |
1051 | en >> en-DE | |
1052 | ar-EG >> ar-SY | |
1053 | pt-BR >> pt | |
1054 | ar-XB >> ar-XB | |
1055 | ar-PSBIDI >> ar-XB # These are equivalent. | |
1056 | en-XA >> en-XA | |
1057 | en-PSACCENT >> en-XA # These are equivalent. | |
1058 | ar-PSCRACK >> ar-PSCRACK | |
1059 | ||
1060 | @favor=script | |
1061 | de >> en-DE | |
1062 | en >> en-DE | |
1063 | ar-EG >> ar-SY | |
1064 | pt-BR >> pt | |
1065 | ar-XB >> ar-XB | |
1066 | ar-PSBIDI >> ar-XB # These are equivalent. | |
1067 | en-XA >> en-XA | |
1068 | en-PSACCENT >> en-XA # These are equivalent. | |
1069 | ar-PSCRACK >> ar-PSCRACK | |
1070 | ||
1071 | ** test: BestMatchForTraditionalChinese | |
1072 | # Scenario: An application that only supports Simplified Chinese (and some | |
1073 | # other languages), but does not support Traditional Chinese. zh-Hans-CN | |
1074 | # could be replaced with zh-CN, zh, or zh-Hans, it wouldn't make much of a | |
1075 | # difference. | |
1076 | # The script distance (simplified vs. traditional Han) is considered small | |
1077 | # enough to be an acceptable match. The regional difference is considered | |
1078 | # almost insignificant. | |
1079 | @supported=fr, zh-Hans-CN, en-US | |
1080 | zh-TW >> zh-Hans-CN | |
1081 | zh-Hant >> zh-Hans-CN | |
1082 | ||
1083 | # For geopolitical reasons, you might want to avoid a zh-Hant -> zh-Hans | |
1084 | # match. In this case, if zh-TW, zh-HK or a tag starting with zh-Hant is | |
1085 | # requested, you can change your call to getBestMatch to include a 2nd | |
1086 | # language preference. "en" is a better match since its distance to "en-US" | |
1087 | # is closer than the distance from "zh-TW" to "zh-CN" (script distance). | |
1088 | zh-TW, en >> en-US | |
1089 | zh-Hant-CN, en >> en-US | |
1090 | zh-Hans, en >> zh-Hans-CN | |
1091 | ||
1092 | ** test: MaxBeforeEquals | |
1093 | # Compare maximized forms of earlier items before testing equality | |
1094 | # of later items. | |
1095 | @supported=en, fr-CA | |
1096 | en-US, fr-CA >> en | |
1097 | ||
1098 | @favor=script | |
1099 | en-US, fr-CA >> en | |
1100 | ||
1101 | ** test: SiblingDefaultRegion | |
1102 | @supported=de-AT, de-DE, de-CH | |
1103 | de >> de-DE | |
1104 | ||
1105 | ** test: ReturnDefaultInsteadOfNullForEmptyPriorityList | |
1106 | @default=und | |
1107 | de >> und | |
1108 | ||
1109 | ** test: ReturnSpecifiedDefaultForNoMatch | |
1110 | @supported=de, en, fr | |
1111 | @default=und | |
1112 | hi >> und | |
1113 | ||
1114 | @favor=script | |
1115 | hi >> und | |
1116 | ||
1117 | ** test: MatchedLanguageIgnoresDefault | |
1118 | @supported=de, en, fr | |
1119 | @default=und | |
1120 | fr >> fr | |
1121 | ||
1122 | @favor=script | |
1123 | fr >> fr | |
1124 | ||
1125 | ## GenX | |
1126 | ||
1127 | ** test: TwoSpanishes | |
1128 | @supported=es, es-MX | |
1129 | @default=und | |
1130 | es-001 >> es | |
1131 | und >> und | |
1132 | ca >> und | |
1133 | gl-ES >> es | |
1134 | es >> es | |
1135 | es-MX >> es-MX | |
1136 | es-002 >> es | |
1137 | es-003 >> es-MX | |
1138 | es-005 >> es-MX | |
1139 | es-019 >> es-MX | |
1140 | es-029 >> es-MX | |
1141 | es-419 >> es-MX | |
1142 | es-142 >> es | |
1143 | es-150 >> es | |
1144 | es-AD >> es | |
1145 | es-AR >> es-MX | |
1146 | es-BO >> es-MX | |
1147 | es-BZ >> es-MX | |
1148 | es-CA >> es-MX | |
1149 | es-CL >> es-MX | |
1150 | es-CO >> es-MX | |
1151 | es-CR >> es-MX | |
1152 | es-CU >> es-MX | |
1153 | es-DO >> es-MX | |
1154 | es-EC >> es-MX | |
1155 | es-ES >> es | |
1156 | es-GI >> es | |
1157 | es-GQ >> es | |
1158 | es-GT >> es-MX | |
1159 | es-HN >> es-MX | |
1160 | es-NI >> es-MX | |
1161 | es-PA >> es-MX | |
1162 | es-PE >> es-MX | |
1163 | es-PH >> es | |
1164 | es-PR >> es-MX | |
1165 | es-PY >> es-MX | |
1166 | es-SV >> es-MX | |
1167 | es-US >> es-MX | |
1168 | es-UY >> es-MX | |
1169 | es-VE >> es-MX | |
1170 | ||
1171 | @favor=script | |
1172 | es-001 >> es | |
1173 | # und >> und # Apple, get es | |
1174 | ca >> es | |
1175 | gl-ES >> es | |
1176 | es >> es | |
1177 | es-MX >> es-MX | |
1178 | es-002 >> es | |
1179 | es-003 >> es-MX | |
1180 | es-005 >> es-MX | |
1181 | es-019 >> es-MX | |
1182 | es-029 >> es-MX | |
1183 | es-419 >> es-MX | |
1184 | es-142 >> es | |
1185 | es-150 >> es | |
1186 | es-AD >> es | |
1187 | es-AR >> es-MX | |
1188 | es-BO >> es-MX | |
1189 | es-BZ >> es-MX | |
1190 | es-CA >> es-MX | |
1191 | es-CL >> es-MX | |
1192 | es-CO >> es-MX | |
1193 | es-CR >> es-MX | |
1194 | es-CU >> es-MX | |
1195 | es-DO >> es-MX | |
1196 | es-EC >> es-MX | |
1197 | es-ES >> es | |
1198 | es-GI >> es | |
1199 | es-GQ >> es | |
1200 | es-GT >> es-MX | |
1201 | es-HN >> es-MX | |
1202 | es-NI >> es-MX | |
1203 | es-PA >> es-MX | |
1204 | es-PE >> es-MX | |
1205 | es-PH >> es | |
1206 | es-PR >> es-MX | |
1207 | es-PY >> es-MX | |
1208 | es-SV >> es-MX | |
1209 | es-US >> es-MX | |
1210 | es-UY >> es-MX | |
1211 | es-VE >> es-MX | |
1212 | ||
1213 | ** test: Three Spanishes | |
1214 | @supported=es, es-419, es-MX | |
1215 | @default=und | |
1216 | es-001 >> es | |
1217 | und >> und | |
1218 | ca >> und | |
1219 | gl-ES >> es | |
1220 | es >> es | |
1221 | es-419 >> es-419 | |
1222 | es-002 >> es | |
1223 | es-003 >> es-419 | |
1224 | es-005 >> es-419 | |
1225 | es-019 >> es-419 | |
1226 | es-029 >> es-419 | |
1227 | es-142 >> es | |
1228 | es-150 >> es | |
1229 | es-AD >> es | |
1230 | es-AR >> es-419 | |
1231 | es-BO >> es-419 | |
1232 | es-BZ >> es-419 | |
1233 | es-CA >> es-419 | |
1234 | es-CL >> es-419 | |
1235 | es-CO >> es-419 | |
1236 | es-CR >> es-419 | |
1237 | es-CU >> es-419 | |
1238 | es-DO >> es-419 | |
1239 | es-EC >> es-419 | |
1240 | es-ES >> es | |
1241 | es-GI >> es | |
1242 | es-GQ >> es | |
1243 | es-GT >> es-419 | |
1244 | es-HN >> es-419 | |
1245 | es-MX >> es-MX | |
1246 | es-NI >> es-419 | |
1247 | es-PA >> es-419 | |
1248 | es-PE >> es-419 | |
1249 | es-PH >> es | |
1250 | es-PR >> es-419 | |
1251 | es-PY >> es-419 | |
1252 | es-SV >> es-419 | |
1253 | es-US >> es-419 | |
1254 | es-UY >> es-419 | |
1255 | es-VE >> es-419 | |
1256 | ||
1257 | @favor=script | |
1258 | es-001 >> es | |
1259 | # und >> und # Apple, get es | |
1260 | ca >> es | |
1261 | gl-ES >> es | |
1262 | es >> es | |
1263 | es-419 >> es-419 | |
1264 | es-002 >> es | |
1265 | es-003 >> es-419 | |
1266 | es-005 >> es-419 | |
1267 | es-019 >> es-419 | |
1268 | es-029 >> es-419 | |
1269 | es-142 >> es | |
1270 | es-150 >> es | |
1271 | es-AD >> es | |
1272 | es-AR >> es-419 | |
1273 | es-BO >> es-419 | |
1274 | es-BZ >> es-419 | |
1275 | es-CA >> es-419 | |
1276 | es-CL >> es-419 | |
1277 | es-CO >> es-419 | |
1278 | es-CR >> es-419 | |
1279 | es-CU >> es-419 | |
1280 | es-DO >> es-419 | |
1281 | es-EC >> es-419 | |
1282 | es-ES >> es | |
1283 | es-GI >> es | |
1284 | es-GQ >> es | |
1285 | es-GT >> es-419 | |
1286 | es-HN >> es-419 | |
1287 | es-MX >> es-MX | |
1288 | es-NI >> es-419 | |
1289 | es-PA >> es-419 | |
1290 | es-PE >> es-419 | |
1291 | es-PH >> es | |
1292 | es-PR >> es-419 | |
1293 | es-PY >> es-419 | |
1294 | es-SV >> es-419 | |
1295 | es-US >> es-419 | |
1296 | es-UY >> es-419 | |
1297 | es-VE >> es-419 | |
1298 | ||
1299 | ** test: Englishes | |
1300 | @supported=en-GB, en-US | |
1301 | @default=und | |
1302 | # und >> und12 | |
1303 | ja >> und | |
1304 | fr-CA >> und | |
1305 | ||
1306 | # Great Britain fallback | |
1307 | en-AU >> en-GB | |
1308 | en-BZ >> en-GB | |
1309 | en-CA >> en-GB | |
1310 | en-IN >> en-GB | |
1311 | en-IE >> en-GB | |
1312 | en-JM >> en-GB | |
1313 | en-NZ >> en-GB | |
1314 | en-PK >> en-GB | |
1315 | en-TT >> en-GB | |
1316 | en-ZA >> en-GB | |
1317 | ||
1318 | # United States fallback | |
1319 | en-US >> en-US | |
1320 | en >> en-US | |
1321 | ||
1322 | @favor=script | |
1323 | # und >> und # Apple, get en_US | |
1324 | ja >> und | |
1325 | # fr-CA >> en-GB # Apple, get en_US | |
1326 | en-AU >> en-GB | |
1327 | en-BZ >> en-GB | |
1328 | en-CA >> en-GB | |
1329 | en-IN >> en-GB | |
1330 | en-IE >> en-GB | |
1331 | en-JM >> en-GB | |
1332 | en-NZ >> en-GB | |
1333 | en-PK >> en-GB | |
1334 | en-TT >> en-GB | |
1335 | en-ZA >> en-GB | |
1336 | en-US >> en-US | |
1337 | en >> en-US | |
1338 | ||
1339 | ** test: TestFallback | |
1340 | # manyEnMatcher | |
1341 | @supported=en-GB, en-US, en, en-AU | |
1342 | @default=und | |
1343 | # und >> und # Apple, get en_US | |
1344 | ja >> und | |
1345 | fr-CA >> und | |
1346 | ||
1347 | # nonUsMatcher | |
1348 | fr >> und | |
1349 | ||
1350 | # onlyAuMatcher | |
1351 | @supported=en-AU, ja, ca | |
1352 | fr >> und | |
1353 | ||
1354 | # noEnMatcher | |
1355 | @supported=pl, ja, ca | |
1356 | fr >> und | |
1357 | ||
1358 | @favor=script | |
1359 | @supported=en-GB, en-US, en, en-AU | |
1360 | # und >> und # Apple, get en_US | |
1361 | ja >> und | |
1362 | # fr-CA >> en-GB # Apple, get en_US | |
1363 | # fr >> en-GB # Apple, get en_US | |
1364 | @supported=en-AU, ja, ca | |
1365 | fr >> en-AU | |
1366 | @supported=pl, ja, ca | |
1367 | fr >> pl | |
1368 | ||
1369 | ## Go | |
1370 | ||
1371 | ** test: basics | |
1372 | @supported=fr, en-GB, en | |
1373 | en-GB >> en-GB | |
1374 | en-US >> en | |
1375 | fr-FR >> fr | |
1376 | ja-JP >> fr | |
1377 | ||
1378 | ** test: script fallbacks | |
1379 | @supported=zh-CN, zh-TW, iw | |
1380 | zh-Hant >> zh-TW | |
1381 | zh >> zh-CN | |
1382 | zh-Hans-CN >> zh-CN | |
1383 | zh-Hant-HK >> zh-TW | |
1384 | @default=iw | |
1385 | he-IT >> iw | |
1386 | ||
1387 | @favor=script | |
1388 | he-IT >> iw | |
1389 | ||
1390 | ** test: language-specific script fallbacks 1 | |
1391 | @supported=en, sr, nl | |
1392 | sr-Latn >> sr | |
1393 | sh >> en | |
1394 | hr >> en | |
1395 | bs >> en | |
1396 | nl-Cyrl >> en # Mark: Expected value should be en not sr. Script difference exceeds threshold, so can't be nl | |
1397 | ||
1398 | @favor=script | |
1399 | sr-Latn >> sr | |
1400 | hr >> en | |
1401 | bs >> en | |
1402 | nl-Cyrl >> sr | |
1403 | ||
1404 | ** test: language-specific script fallbacks 2 | |
1405 | @supported=en, sr-Latn | |
1406 | sr >> sr-Latn | |
1407 | sr-Cyrl >> sr-Latn | |
1408 | @default=und | |
1409 | hr >> und | |
1410 | ||
1411 | @favor=script | |
1412 | @default= | |
1413 | sr >> sr-Latn | |
1414 | sr-Cyrl >> sr-Latn | |
1415 | @default=und | |
1416 | hr >> en | |
1417 | ||
1418 | ** test: don't match hr to sr-Latn | |
1419 | @supported=en, sr-Latn | |
1420 | hr >> en | |
1421 | ||
1422 | @favor=script | |
1423 | hr >> en | |
1424 | ||
1425 | ** test: both deprecated and not | |
1426 | @supported=fil, tl, iw, he | |
1427 | he-IT >> iw | |
1428 | he >> iw | |
1429 | iw >> iw | |
1430 | fil-IT >> fil | |
1431 | fil >> fil | |
1432 | tl >> fil | |
1433 | ||
1434 | @favor=script | |
1435 | he-IT >> iw | |
1436 | he >> iw | |
1437 | iw >> iw | |
1438 | fil-IT >> fil | |
1439 | fil >> fil | |
1440 | tl >> fil | |
1441 | ||
1442 | ** test: nearby languages: Nynorsk to Bokmål | |
1443 | @supported=en, nb | |
1444 | nn >> nb | |
1445 | ||
1446 | @favor=script | |
1447 | nn >> nb | |
1448 | ||
1449 | ** test: nearby languages: Danish does not match nn | |
1450 | @supported=en, nn | |
1451 | da >> en | |
1452 | ||
1453 | @favor=script | |
1454 | da >> en | |
1455 | ||
1456 | ** test: nearby languages: Danish matches no | |
1457 | @supported=en, no | |
1458 | da >> no | |
1459 | ||
1460 | @favor=script | |
1461 | da >> no | |
1462 | ||
1463 | ** test: nearby languages: Danish matches nb | |
1464 | @supported=en, nb | |
1465 | da >> nb | |
1466 | ||
1467 | ** test: prefer matching languages over language variants. | |
1468 | @supported=nn, en-GB | |
1469 | no, en-US >> nn | |
1470 | nb, en-US >> nn | |
1471 | ||
1472 | @favor=script | |
1473 | no, en-US >> nn | |
1474 | nb, en-US >> nn | |
1475 | ||
1476 | ** test: deprecated version is closer than same language with other differences | |
1477 | @supported=nl, he, en-GB | |
1478 | iw, en-US >> he | |
1479 | ||
1480 | @favor=script | |
1481 | iw, en-US >> he | |
1482 | ||
1483 | ** test: macro equivalent is closer than same language with other differences | |
1484 | @supported=nl, zh, en-GB, no | |
1485 | cmn, en-US >> zh | |
1486 | nb, en-US >> no | |
1487 | ||
1488 | @favor=script | |
1489 | cmn, en-US >> zh | |
1490 | nb, en-US >> no | |
1491 | ||
1492 | ** test: legacy equivalent is closer than same language with other differences | |
1493 | @supported=nl, fil, en-GB | |
1494 | tl, en-US >> fil | |
1495 | ||
1496 | @favor=script | |
1497 | tl, en-US >> fil | |
1498 | ||
1499 | ** test: distinguish near equivalents | |
1500 | @supported=en, ro, mo, ro-MD | |
1501 | ro >> ro | |
1502 | mo >> ro # ro=mo for the locale matcher | |
1503 | ro-MD >> ro-MD | |
1504 | ||
1505 | @favor=script | |
1506 | ro >> ro | |
1507 | mo >> ro # ro=mo for the locale matcher | |
1508 | ro-MD >> ro-MD | |
1509 | ||
1510 | ** test: maximization of legacy | |
1511 | @supported=sr-Cyrl, sr-Latn, ro, ro-MD | |
1512 | sh >> sr-Latn | |
1513 | mo >> ro | |
1514 | ||
1515 | @favor=script | |
1516 | sh >> sr-Latn | |
1517 | mo >> ro | |
1518 | ||
1519 | ** test: empty | |
1520 | fr >> null | |
1521 | en >> null | |
1522 | ||
1523 | ** test: private use subtags | |
1524 | @supported=fr, en-GB, x-bork, es-ES, es-419 | |
1525 | x-piglatin >> fr | |
1526 | x-bork >> x-bork | |
1527 | ||
1528 | ** test: grandfathered codes | |
1529 | @supported=fr, i-klingon, en-Latn-US | |
1530 | en-GB-oed >> en-Latn-US | |
1531 | i-klingon >> tlh | |
1532 | ||
1533 | ||
1534 | ** test: simple variant match | |
1535 | @supported=fr, en-GB, ja, es-ES, es-MX | |
1536 | de, en-US >> en-GB | |
1537 | de, zh >> fr | |
1538 | ||
1539 | ** test: best match for traditional Chinese | |
1540 | @supported=fr, zh-Hans-CN, en-US | |
1541 | zh-TW >> zh-Hans-CN | |
1542 | zh-Hant >> zh-Hans-CN | |
1543 | zh-TW, en >> en-US | |
1544 | zh-Hant-CN, en >> en-US | |
1545 | zh-Hans, en >> zh-Hans-CN | |
1546 | ||
1547 | ** test: return first among likely-subtags equivalent locales | |
1548 | # Was: more specific script should win in case regions are identical | |
1549 | # with some different results. | |
1550 | @supported=af, af-Latn, af-Arab | |
1551 | af >> af | |
1552 | af-ZA >> af | |
1553 | af-Latn-ZA >> af | |
1554 | af-Latn >> af | |
1555 | ||
1556 | @favor=script | |
1557 | af >> af | |
1558 | af-ZA >> af | |
1559 | af-Latn-ZA >> af | |
1560 | af-Latn >> af | |
1561 | ||
1562 | # Was: more specific region should win | |
1563 | # with some different results. | |
1564 | @supported=nl, nl-NL, nl-BE | |
1565 | @favor= | |
1566 | nl >> nl | |
1567 | nl-Latn >> nl | |
1568 | nl-Latn-NL >> nl | |
1569 | nl-NL >> nl | |
1570 | ||
1571 | @favor=script | |
1572 | nl >> nl | |
1573 | nl-Latn >> nl | |
1574 | nl-Latn-NL >> nl | |
1575 | nl-NL >> nl | |
1576 | ||
1577 | # Was: more specific region wins over more specific script | |
1578 | # with some different results. | |
1579 | @supported=nl, nl-Latn, nl-NL, nl-BE | |
1580 | @favor= | |
1581 | nl >> nl | |
1582 | nl-Latn >> nl | |
1583 | nl-NL >> nl | |
1584 | nl-Latn-NL >> nl | |
1585 | ||
1586 | @favor=script | |
1587 | nl >> nl | |
1588 | nl-Latn >> nl | |
1589 | nl-NL >> nl | |
1590 | nl-Latn-NL >> nl | |
1591 | ||
1592 | ** test: region may replace matched if matched is enclosing | |
1593 | @supported=es-419, es | |
1594 | @default=es-MX | |
1595 | es-MX >> es-419 | |
1596 | @default= | |
1597 | es-SG >> es | |
1598 | ||
1599 | @favor=script | |
1600 | @default=es-MX | |
1601 | es-MX >> es-419 | |
1602 | @default= | |
1603 | es-SG >> es | |
1604 | ||
1605 | ** test: region distance Portuguese | |
1606 | @supported=pt, pt-PT | |
1607 | pt-ES >> pt-PT | |
1608 | ||
1609 | @favor=script | |
1610 | pt-ES >> pt-PT | |
1611 | ||
1612 | ** test: if no preferred locale specified, pick top language, not regional | |
1613 | @supported=en, fr, fr-CA, fr-CH | |
1614 | fr-US >> fr | |
1615 | ||
1616 | @favor=script | |
1617 | fr-US >> fr | |
1618 | ||
1619 | ** test: region distance German | |
1620 | @supported=de-AT, de-DE, de-CH | |
1621 | de >> de-DE | |
1622 | ||
1623 | ** test: en-AU is closer to en-GB than to en (which is en-US) | |
1624 | @supported=en, en-GB, es-ES, es-419 | |
1625 | en-AU >> en-GB | |
1626 | @default=es-MX | |
1627 | es-MX >> es-419 | |
1628 | @default= | |
1629 | es-PT >> es-ES | |
1630 | ||
1631 | @favor=script | |
1632 | en-AU >> en-GB | |
1633 | es-MX >> es-419 | |
1634 | @default= | |
1635 | es-PT >> es-ES | |
1636 | ||
1637 | ** test: undefined | |
1638 | @supported=it, fr | |
1639 | und >> it | |
1640 | ||
1641 | ** test: und does not match en | |
1642 | @supported=it, en | |
1643 | # und >> it # Apple, get en | |
1644 | ||
1645 | ** test: undefined in priority list | |
1646 | @supported=it, und | |
1647 | und >> und | |
1648 | # en >> it # Apple, get und | |
1649 | ||
1650 | ** test: undefined | |
1651 | @supported=it, fr, zh | |
1652 | und-FR >> fr | |
1653 | und-CN >> zh | |
1654 | und-Hans >> zh | |
1655 | und-Hant >> zh | |
1656 | und-Latn >> it | |
1657 | ||
1658 | @favor=script | |
1659 | und-FR >> fr | |
1660 | und-CN >> zh | |
1661 | und-Hans >> zh | |
1662 | und-Hant >> zh | |
1663 | und-Latn >> it | |
1664 | ||
1665 | ** test: match on maximized tag | |
1666 | @supported=fr, en-GB, ja, es-ES, es-MX | |
1667 | ja-JP, en-GB >> ja | |
1668 | ja-Jpan-JP, en-GB >> ja | |
1669 | ||
1670 | ** test: pick best maximized tag | |
1671 | @supported=ja, ja-Jpan-US, ja-JP, en, ru | |
1672 | ja-Jpan, ru >> ja | |
1673 | ja-JP, ru >> ja | |
1674 | ja-US, ru >> ja-Jpan-US | |
1675 | ||
1676 | @favor=script | |
1677 | ja-Jpan, ru >> ja | |
1678 | ja-JP, ru >> ja | |
1679 | ja-US, ru >> ja-Jpan-US | |
1680 | ||
1681 | ** test: termination: pick best maximized match | |
1682 | @supported=ja, ja-Jpan, ja-JP, en, ru | |
1683 | ja-Jpan-JP, ru >> ja | |
1684 | ja-Jpan, ru >> ja | |
1685 | ||
1686 | @favor=script | |
1687 | ja-Jpan-JP, ru >> ja | |
1688 | ja-Jpan, ru >> ja | |
1689 | ||
1690 | ** test: same language over exact, but distinguish when user is explicit | |
1691 | @supported=fr, en-GB, ja, es-ES, es-MX | |
1692 | ja, de >> ja | |
1693 | @supported=en, de, fr, ja | |
1694 | de-CH, fr >> de | |
1695 | @supported=en-GB, nl | |
1696 | en, nl >> en-GB | |
1697 | en, nl, en-GB >> en-GB | |
1698 | ||
1699 | @favor=script | |
1700 | @supported=fr, en-GB, ja, es-ES, es-MX | |
1701 | ja, de >> ja | |
1702 | @supported=en, de, fr, ja | |
1703 | de-CH, fr >> de | |
1704 | @supported=en-GB, nl | |
1705 | en, nl >> en-GB | |
1706 | en, nl, en-GB >> en-GB | |
1707 | ||
1708 | ** test: parent relation preserved | |
1709 | @supported=en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK | |
1710 | en-150 >> en-GB | |
1711 | en-AU >> en-GB | |
1712 | en-BE >> en-GB | |
1713 | en-GG >> en-GB | |
1714 | en-GI >> en-GB | |
1715 | en-HK >> en-GB | |
1716 | en-IE >> en-GB | |
1717 | en-IM >> en-GB | |
1718 | en-IN >> en-GB | |
1719 | en-JE >> en-GB | |
1720 | en-MT >> en-GB | |
1721 | en-NZ >> en-GB | |
1722 | en-PK >> en-GB | |
1723 | en-SG >> en-GB | |
1724 | en-DE >> en-GB | |
1725 | @default=es-AR | |
1726 | es-AR >> es-419 | |
1727 | @default=es-BO | |
1728 | es-BO >> es-419 | |
1729 | @default=es-CL | |
1730 | es-CL >> es-419 | |
1731 | @default=es-CO | |
1732 | es-CO >> es-419 | |
1733 | @default=es-CR | |
1734 | es-CR >> es-419 | |
1735 | @default=es-CU | |
1736 | es-CU >> es-419 | |
1737 | @default=es-DO | |
1738 | es-DO >> es-419 | |
1739 | @default=es-EC | |
1740 | es-EC >> es-419 | |
1741 | @default=es-GT | |
1742 | es-GT >> es-419 | |
1743 | @default=es-HN | |
1744 | es-HN >> es-419 | |
1745 | @default=es-MX | |
1746 | es-MX >> es-419 | |
1747 | @default=es-NI | |
1748 | es-NI >> es-419 | |
1749 | @default=es-PA | |
1750 | es-PA >> es-419 | |
1751 | @default=es-PE | |
1752 | es-PE >> es-419 | |
1753 | @default=es-PR | |
1754 | es-PR >> es-419 | |
1755 | @default= | |
1756 | es-PT >> es | |
1757 | @default=es-PY | |
1758 | es-PY >> es-419 | |
1759 | @default=es-SV | |
1760 | es-SV >> es-419 | |
1761 | @default= | |
1762 | es-US >> es-419 | |
1763 | @default=es-UY | |
1764 | es-UY >> es-419 | |
1765 | @default=es-VE | |
1766 | es-VE >> es-419 | |
1767 | @default= | |
1768 | pt-AO >> pt-PT | |
1769 | pt-CV >> pt-PT | |
1770 | pt-GW >> pt-PT | |
1771 | pt-MO >> pt-PT | |
1772 | pt-MZ >> pt-PT | |
1773 | pt-ST >> pt-PT | |
1774 | pt-TL >> pt-PT | |
1775 | ||
1776 | @favor=script | |
1777 | en-150 >> en-GB | |
1778 | en-AU >> en-GB | |
1779 | en-BE >> en-GB | |
1780 | en-GG >> en-GB | |
1781 | en-GI >> en-GB | |
1782 | en-HK >> en-GB | |
1783 | en-IE >> en-GB | |
1784 | en-IM >> en-GB | |
1785 | en-IN >> en-GB | |
1786 | en-JE >> en-GB | |
1787 | en-MT >> en-GB | |
1788 | en-NZ >> en-GB | |
1789 | en-PK >> en-GB | |
1790 | en-SG >> en-GB | |
1791 | en-DE >> en-GB | |
1792 | @default=es-AR | |
1793 | es-AR >> es-419 | |
1794 | @default=es-BO | |
1795 | es-BO >> es-419 | |
1796 | @default=es-CL | |
1797 | es-CL >> es-419 | |
1798 | @default=es-CO | |
1799 | es-CO >> es-419 | |
1800 | @default=es-CR | |
1801 | es-CR >> es-419 | |
1802 | @default=es-CU | |
1803 | es-CU >> es-419 | |
1804 | @default=es-DO | |
1805 | es-DO >> es-419 | |
1806 | @default=es-EC | |
1807 | es-EC >> es-419 | |
1808 | @default=es-GT | |
1809 | es-GT >> es-419 | |
1810 | @default=es-HN | |
1811 | es-HN >> es-419 | |
1812 | @default=es-MX | |
1813 | es-MX >> es-419 | |
1814 | @default=es-NI | |
1815 | es-NI >> es-419 | |
1816 | @default=es-PA | |
1817 | es-PA >> es-419 | |
1818 | @default=es-PE | |
1819 | es-PE >> es-419 | |
1820 | @default=es-PR | |
1821 | es-PR >> es-419 | |
1822 | @default= | |
1823 | es-PT >> es | |
1824 | @default=es-PY | |
1825 | es-PY >> es-419 | |
1826 | @default=es-SV | |
1827 | es-SV >> es-419 | |
1828 | @default= | |
1829 | es-US >> es-419 | |
1830 | @default=es-UY | |
1831 | es-UY >> es-419 | |
1832 | @default=es-VE | |
1833 | es-VE >> es-419 | |
1834 | @default= | |
1835 | pt-AO >> pt-PT | |
1836 | pt-CV >> pt-PT | |
1837 | pt-GW >> pt-PT | |
1838 | pt-MO >> pt-PT | |
1839 | pt-MZ >> pt-PT | |
1840 | pt-ST >> pt-PT | |
1841 | pt-TL >> pt-PT | |
1842 | ||
1843 | ** test: preserve extensions | |
1844 | @supported=en, de, sl-NEDIS | |
1845 | @default=de-u-co-phonebk | |
1846 | de-FR-u-co-phonebk >> de | |
1847 | @default=sl-NEDIS-u-cu-eur | |
1848 | sl-NEDIS-u-cu-eur >> sl-NEDIS | |
1849 | sl-u-cu-eur >> sl-NEDIS | |
1850 | sl-HR-NEDIS-u-cu-eur >> sl-NEDIS | |
1851 | @default=de-t-m0-iso-i0-pinyin | |
1852 | de-t-m0-iso-i0-pinyin >> de | |
1853 | ||
1854 | @favor=script | |
1855 | @default=de-u-co-phonebk | |
1856 | de-FR-u-co-phonebk >> de | |
1857 | @default=sl-NEDIS-u-cu-eur | |
1858 | sl-NEDIS-u-cu-eur >> sl-NEDIS | |
1859 | sl-u-cu-eur >> sl-NEDIS | |
1860 | sl-HR-NEDIS-u-cu-eur >> sl-NEDIS | |
1861 | @default=de-t-m0-iso-i0-pinyin | |
1862 | de-t-m0-iso-i0-pinyin >> de | |
1863 | ||
1864 | ## ULS | |
1865 | ||
1866 | ** test: testEmptyUserLanguagesGetsEmpty_getBestMatches | |
1867 | @supported=de | |
1868 | >> de | |
1869 | ||
1870 | ** test: testNoStrongMatchGetsEmpty_getBestMatches | |
1871 | @supported=de | |
1872 | fr >> de | |
1873 | ||
1874 | @favor=script | |
1875 | fr >> de | |
1876 | ||
1877 | ** test: testLooseMatchForGeneral_getBestMatches | |
1878 | @supported=es-419 | |
1879 | es-MX >> es-419 | |
1880 | ||
1881 | @favor=script | |
1882 | es-MX >> es-419 | |
1883 | ||
1884 | ** test: testLooseMatchForEnglish_getBestMatches | |
1885 | @supported=en, en-GB | |
1886 | en-CA >> en-GB | |
1887 | ||
1888 | @favor=script | |
1889 | en-CA >> en-GB | |
1890 | ||
1891 | ** test: testLooseMatchForChinese_getBestMatches | |
1892 | @supported=zh | |
1893 | zh-TW >> zh | |
1894 | ||
1895 | @favor=script | |
1896 | zh-TW >> zh | |
1897 | ||
1898 | ## Geo | |
1899 | ||
1900 | ** test: testGetBestMatchWithMinMatchScore | |
1901 | @supported=fr-FR, fr, fr-CA, en | |
1902 | @default=und | |
1903 | fr >> fr-FR # First likely-subtags equivalent match is chosen. | |
1904 | @supported=en, fr, fr-CA | |
1905 | fr-FR >> fr # Parent match is chosen. | |
1906 | @supported=en, fr-CA | |
1907 | fr-FR >> fr-CA # Sibling match is chosen. | |
1908 | @supported=fr-CA, fr-FR | |
1909 | fr >> fr-FR # Inferred region match is chosen. | |
1910 | fr-SN >> fr-CA | |
1911 | @supported=en, fr-FR | |
1912 | fr >> fr-FR # Child match is chosen. | |
1913 | @supported=de, en, it | |
1914 | fr >> und | |
1915 | @supported=iw, en | |
1916 | iw-Latn >> und | |
1917 | @supported=iw, no | |
1918 | ru >> und | |
1919 | @supported=iw-Latn, iw-Cyrl, iw | |
1920 | ru >> und | |
1921 | @supported=iw, iw-Latn | |
1922 | ru >> und | |
1923 | en >> und | |
1924 | @supported=en, uk | |
1925 | ru >> und | |
1926 | @supported=zh-TW, en | |
1927 | zh-CN >> zh-TW | |
1928 | @supported=ja | |
1929 | ru >> und | |
1930 | ||
1931 | @favor=script | |
1932 | @supported=fr-FR, fr, fr-CA, en | |
1933 | fr >> fr-FR | |
1934 | @supported=en, fr, fr-CA | |
1935 | fr-FR >> fr | |
1936 | @supported=en, fr-CA | |
1937 | fr-FR >> fr-CA | |
1938 | @supported=fr-CA, fr-FR | |
1939 | fr >> fr-FR | |
1940 | fr-SN >> fr-CA | |
1941 | @supported=en, fr-FR | |
1942 | fr >> fr-FR | |
1943 | @supported=de, en, it | |
1944 | fr >> en | |
1945 | @supported=iw, en | |
1946 | iw-Latn >> en | |
1947 | @supported=iw, no | |
1948 | ru >> und | |
1949 | @supported=iw-Latn, iw-Cyrl, iw | |
1950 | ru >> iw-Cyrl | |
1951 | @supported=iw, iw-Latn | |
1952 | ru >> und | |
1953 | en >> iw-Latn | |
1954 | @supported=en, uk | |
1955 | ru >> uk | |
1956 | @supported=zh-TW, en | |
1957 | zh-CN >> zh-TW | |
1958 | @supported=ja | |
1959 | ru >> und |