--- old/make/data/lsrdata/language-subtag-registry.txt 2020-04-06 12:13:26.000000000 -0700 +++ new/make/data/lsrdata/language-subtag-registry.txt 2020-04-06 12:13:26.000000000 -0700 @@ -1,4 +1,4 @@ -File-Date: 2020-03-16 +File-Date: 2020-04-01 %% Type: language Subtag: aa @@ -1530,7 +1530,7 @@ %% Type: language Subtag: adb -Description: Adabe +Description: Atauran Added: 2009-07-29 %% Type: language @@ -2707,6 +2707,7 @@ Subtag: aoh Description: Arma Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: aoi @@ -3770,6 +3771,7 @@ Subtag: ayy Description: Tayabas Ayta Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: ayz @@ -4085,6 +4087,7 @@ Subtag: bbz Description: Babalia Creole Arabic Added: 2009-07-29 +Deprecated: 2020-03-28 Macrolanguage: ar %% Type: language @@ -5755,6 +5758,7 @@ Subtag: bpb Description: Barbacoas Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: bpd @@ -6011,7 +6015,7 @@ %% Type: language Subtag: brf -Description: Bera +Description: Bira Added: 2009-07-29 %% Type: language @@ -7374,6 +7378,7 @@ Subtag: cca Description: Cauca Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: ccc @@ -7480,6 +7485,7 @@ Subtag: cdg Description: Chamari Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: cdh @@ -7875,6 +7881,11 @@ Added: 2009-07-29 %% Type: language +Subtag: ckm +Description: Chakavian +Added: 2020-03-28 +%% +Type: language Subtag: ckn Description: Kaang Chin Added: 2013-09-10 @@ -8121,6 +8132,13 @@ Added: 2009-07-29 %% Type: language +Subtag: cnp +Description: Northern Ping Chinese +Description: Northern Pinghua +Added: 2020-03-28 +Macrolanguage: zh +%% +Type: language Subtag: cnr Description: Montenegrin Added: 2018-01-23 @@ -8564,6 +8582,13 @@ Added: 2009-07-29 %% Type: language +Subtag: csp +Description: Southern Ping Chinese +Description: Southern Pinghua +Added: 2020-03-28 +Macrolanguage: zh +%% +Type: language Subtag: csq Description: Croatia Sign Language Added: 2009-07-29 @@ -9318,6 +9343,7 @@ Type: language Subtag: dgr Description: Dogrib +Description: Tłı̨chǫ Added: 2005-10-16 %% Type: language @@ -9334,6 +9360,7 @@ Subtag: dgu Description: Degaru Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: dgw @@ -9720,6 +9747,11 @@ Added: 2009-07-29 %% Type: language +Subtag: dmf +Description: Medefaidrin +Added: 2020-03-28 +%% +Type: language Subtag: dmg Description: Upper Kinabatangan Added: 2009-07-29 @@ -10041,6 +10073,8 @@ Subtag: drr Description: Dororo Added: 2009-07-29 +Deprecated: 2020-03-28 +Preferred-Value: kzk %% Type: language Subtag: drs @@ -10330,6 +10364,11 @@ Added: 2009-07-29 %% Type: language +Subtag: dwk +Description: Dawik Kui +Added: 2020-03-28 +%% +Type: language Subtag: dwl Description: Walo Kumbe Dogon Added: 2009-07-29 @@ -10455,6 +10494,11 @@ Added: 2013-09-10 %% Type: language +Subtag: ebc +Description: Beginci +Added: 2020-03-28 +%% +Type: language Subtag: ebg Description: Ebughu Added: 2009-07-29 @@ -10576,6 +10620,7 @@ Subtag: ekc Description: Eastern Karnic Added: 2013-09-10 +Deprecated: 2020-03-28 %% Type: language Subtag: eke @@ -11881,6 +11926,7 @@ Type: language Subtag: gdh Description: Gadjerawang +Description: Gajirrabeng Added: 2009-07-29 %% Type: language @@ -11970,6 +12016,11 @@ Added: 2009-07-29 %% Type: language +Subtag: gef +Description: Gerai +Added: 2020-03-28 +%% +Type: language Subtag: geg Description: Gengle Added: 2009-07-29 @@ -12381,6 +12432,8 @@ Subtag: gli Description: Guliguli Added: 2009-07-29 +Deprecated: 2020-03-28 +Preferred-Value: kzk %% Type: language Subtag: glj @@ -12481,6 +12534,12 @@ Added: 2009-07-29 %% Type: language +Subtag: gmr +Description: Mirning +Description: Mirniny +Added: 2020-03-28 +%% +Type: language Subtag: gmv Description: Gamo Added: 2009-07-29 @@ -13155,6 +13214,7 @@ %% Type: language Subtag: gwc +Description: Gawri Description: Kalami Added: 2009-07-29 %% @@ -13859,6 +13919,11 @@ Added: 2009-07-29 %% Type: language +Subtag: hng +Description: Hungu +Added: 2020-03-28 +%% +Type: language Subtag: hnh Description: ǁAni Added: 2009-07-29 @@ -14140,6 +14205,7 @@ Type: language Subtag: huc Description: ǂHua +Description: ǂʼAmkhoe Added: 2009-07-29 %% Type: language @@ -15910,6 +15976,7 @@ Type: language Subtag: kaa Description: Kara-Kalpak +Description: Karakalpak Added: 2005-10-16 %% Type: language @@ -17067,8 +17134,9 @@ %% Type: language Subtag: kjf -Description: Khalaj +Description: Khalaj [Indo-Iranian] Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: kjg @@ -17248,7 +17316,7 @@ %% Type: language Subtag: kkq -Description: Kaiku +Description: Kaeku Added: 2009-07-29 %% Type: language @@ -17344,7 +17412,7 @@ %% Type: language Subtag: klj -Description: Turkic Khalaj +Description: Khalaj Added: 2009-07-29 %% Type: language @@ -18497,6 +18565,7 @@ Type: language Subtag: kui Description: Kuikúro-Kalapálo +Description: Kalapalo Added: 2009-07-29 %% Type: language @@ -18908,6 +18977,8 @@ Subtag: kxl Description: Nepali Kurux Added: 2009-07-29 +Deprecated: 2020-03-28 +Preferred-Value: kru %% Type: language Subtag: kxm @@ -18953,6 +19024,8 @@ Subtag: kxu Description: Kui (India) Added: 2009-07-29 +Deprecated: 2020-03-28 +Comments: see dwk, uki %% Type: language Subtag: kxv @@ -20337,6 +20410,7 @@ Subtag: lmz Description: Lumbee Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: lna @@ -22788,6 +22862,7 @@ %% Type: language Subtag: moe +Description: Innu Description: Montagnais Added: 2009-07-29 %% @@ -26199,6 +26274,11 @@ Added: 2009-07-29 %% Type: language +Subtag: nsb +Description: Lower Nossob +Added: 2020-03-28 +%% +Type: language Subtag: nsc Description: Nshi Added: 2009-07-29 @@ -26667,6 +26747,8 @@ Subtag: nxu Description: Narau Added: 2009-07-29 +Deprecated: 2020-03-28 +Preferred-Value: bpp %% Type: language Subtag: nxx @@ -28166,7 +28248,7 @@ %% Type: language Subtag: pfe -Description: Peere +Description: Pere Added: 2009-07-29 %% Type: language @@ -28572,6 +28654,7 @@ Subtag: plp Description: Palpa Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: plq @@ -31132,6 +31215,8 @@ Subtag: sdm Description: Semandang Added: 2009-07-29 +Deprecated: 2020-03-28 +Comments: see ebc, gef, sdq %% Type: language Subtag: sdn @@ -31150,6 +31235,11 @@ Added: 2009-07-29 %% Type: language +Subtag: sdq +Description: Semandang +Added: 2020-03-28 +%% +Type: language Subtag: sdr Description: Oraon Sadri Added: 2009-07-29 @@ -33502,6 +33592,7 @@ Subtag: tbb Description: Tapeba Added: 2009-07-29 +Deprecated: 2020-03-28 %% Type: language Subtag: tbc @@ -36240,6 +36331,11 @@ Added: 2009-07-29 %% Type: language +Subtag: uki +Description: Kui (India) +Added: 2020-03-28 +%% +Type: language Subtag: ukk Description: Muak Sa-aak Added: 2017-02-23 @@ -36271,6 +36367,11 @@ Added: 2009-07-29 %% Type: language +Subtag: ukv +Description: Kuku +Added: 2020-03-28 +%% +Type: language Subtag: ukw Description: Ukwuani-Aboh-Ndoni Added: 2009-07-29 @@ -37760,6 +37861,11 @@ Added: 2009-07-29 %% Type: language +Subtag: wlh +Description: Welaun +Added: 2020-03-28 +%% +Type: language Subtag: wli Description: Waioli Added: 2009-07-29 @@ -39232,6 +39338,11 @@ Added: 2013-09-10 %% Type: language +Subtag: xnm +Description: Ngumbarl +Added: 2020-03-28 +%% +Type: language Subtag: xnn Description: Northern Kankanay Added: 2009-07-29 @@ -39334,22 +39445,45 @@ Added: 2013-09-10 %% Type: language +Subtag: xpb +Description: Northeastern Tasmanian +Description: Pyemmairrener +Added: 2020-03-28 +%% +Type: language Subtag: xpc Description: Pecheneg Added: 2009-07-29 %% Type: language +Subtag: xpd +Description: Oyster Bay Tasmanian +Added: 2020-03-28 +%% +Type: language Subtag: xpe Description: Liberia Kpelle Added: 2009-07-29 Macrolanguage: kpe %% Type: language +Subtag: xpf +Description: Southeast Tasmanian +Description: Nuenonne +Added: 2020-03-28 +%% +Type: language Subtag: xpg Description: Phrygian Added: 2009-07-29 %% Type: language +Subtag: xph +Description: North Midlands Tasmanian +Description: Tyerrenoterpanner +Added: 2020-03-28 +%% +Type: language Subtag: xpi Description: Pictish Added: 2009-07-29 @@ -39365,6 +39499,11 @@ Added: 2009-07-29 %% Type: language +Subtag: xpl +Description: Port Sorell Tasmanian +Added: 2020-03-28 +%% +Type: language Subtag: xpm Description: Pumpokol Added: 2009-07-29 @@ -39410,11 +39549,34 @@ Added: 2009-07-29 %% Type: language +Subtag: xpv +Description: Northern Tasmanian +Description: Tommeginne +Added: 2020-03-28 +%% +Type: language +Subtag: xpw +Description: Northwestern Tasmanian +Description: Peerapper +Added: 2020-03-28 +%% +Type: language +Subtag: xpx +Description: Southwestern Tasmanian +Description: Toogee +Added: 2020-03-28 +%% +Type: language Subtag: xpy Description: Puyo Added: 2009-07-29 %% Type: language +Subtag: xpz +Description: Bruny Island Tasmanian +Added: 2020-03-28 +%% +Type: language Subtag: xqa Description: Karakhanid Added: 2009-07-29 @@ -39468,6 +39630,8 @@ Subtag: xrq Description: Karranga Added: 2013-09-10 +Deprecated: 2020-03-28 +Preferred-Value: dmw %% Type: language Subtag: xrr @@ -39700,6 +39864,8 @@ Subtag: xtz Description: Tasmanian Added: 2009-07-29 +Deprecated: 2020-03-28 +Comments: see xpb, xpd, xpf, xph, xpl, xpv, xpw, xpx, xpz %% Type: language Subtag: xua @@ -39729,6 +39895,7 @@ Type: language Subtag: xul Description: Ngunawal +Description: Nunukul Added: 2013-09-10 %% Type: language @@ -41321,6 +41488,11 @@ Added: 2009-07-29 %% Type: language +Subtag: zba +Description: Balaibalan +Added: 2020-03-28 +%% +Type: language Subtag: zbc Description: Central Berawan Added: 2009-07-29 @@ -41486,6 +41658,8 @@ Subtag: zir Description: Ziriya Added: 2009-07-29 +Deprecated: 2020-03-28 +Preferred-Value: scv %% Type: language Subtag: ziw @@ -42463,6 +42637,7 @@ Subtag: bbz Description: Babalia Creole Arabic Added: 2009-07-29 +Deprecated: 2020-03-28 Preferred-Value: bbz Prefix: ar Macrolanguage: ar @@ -42580,6 +42755,15 @@ Macrolanguage: zh %% Type: extlang +Subtag: cnp +Description: Northern Ping Chinese +Description: Northern Pinghua +Added: 2020-03-28 +Preferred-Value: cnp +Prefix: zh +Macrolanguage: zh +%% +Type: extlang Subtag: coa Description: Cocos Islands Malay Added: 2009-07-29 @@ -42647,6 +42831,15 @@ Prefix: sgn %% Type: extlang +Subtag: csp +Description: Southern Ping Chinese +Description: Southern Pinghua +Added: 2020-03-28 +Preferred-Value: csp +Prefix: zh +Macrolanguage: zh +%% +Type: extlang Subtag: csq Description: Croatia Sign Language Added: 2009-07-29 @@ -46630,6 +46823,12 @@ Letras in 1943 and generally used in Brazil until 2009 %% Type: variant +Subtag: akuapem +Description: Akuapem Twi +Added: 2017-06-05 +Prefix: tw +%% +Type: variant Subtag: alalc97 Description: ALA-LC Romanization, 1997 edition Added: 2009-12-09 @@ -46648,12 +46847,6 @@ continuum in Eastern Suriname and Western French Guiana %% Type: variant -Subtag: akuapem -Description: Akuapem Twi -Added: 2017-06-05 -Prefix: tw -%% -Type: variant Subtag: ao1990 Description: Portuguese Language Orthographic Agreement of 1990 (Acordo Ortográfico da Língua Portuguesa de 1990) --- old/make/jdk/src/classes/build/tools/generatelsrequivmaps/EquivMapsGenerator.java 2020-04-06 12:13:28.000000000 -0700 +++ new/make/jdk/src/classes/build/tools/generatelsrequivmaps/EquivMapsGenerator.java 2020-04-06 12:13:27.000000000 -0700 @@ -33,10 +33,12 @@ import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TreeMap; +import java.util.stream.Collectors; /** * This tool reads the IANA Language Subtag Registry data file downloaded from @@ -75,32 +77,49 @@ String type = null; String tag = null; String preferred = null; + String prefix = null; for (String line : Files.readAllLines(Paths.get(filename), Charset.forName("UTF-8"))) { line = line.toLowerCase(Locale.ROOT); - int index = line.indexOf(' ')+1; + int index = line.indexOf(' ') + 1; if (line.startsWith("file-date:")) { LSRrevisionDate = line.substring(index); } else if (line.startsWith("type:")) { type = line.substring(index); } else if (line.startsWith("tag:") || line.startsWith("subtag:")) { tag = line.substring(index); - } else if (line.startsWith("preferred-value:") - && !type.equals("extlang")) { + } else if (line.startsWith("preferred-value:")) { preferred = line.substring(index); - processDeprecatedData(type, tag, preferred); + } else if (line.startsWith("prefix:")) { + prefix = line.substring(index); } else if (line.equals("%%")) { + processDeprecatedData(type, tag, preferred, prefix); type = null; tag = null; + preferred = null; + prefix = null; } } + + // Last entry + processDeprecatedData(type, tag, preferred, prefix); } private static void processDeprecatedData(String type, String tag, - String preferred) { + String preferred, + String prefix) { StringBuilder sb; + + if (type == null || tag == null || preferred == null) { + return; + } + + if (type.equals("extlang") && prefix != null) { + tag = prefix + "-" + tag; + } + if (type.equals("region") || type.equals("variant")) { if (!initialRegionVariantMap.containsKey(preferred)) { sb = new StringBuilder("-"); @@ -113,7 +132,7 @@ + " A region/variant subtag \"" + preferred + "\" is registered for more than one subtags."); } - } else { // language, grandfahered, and redundant + } else { // language, extlang, grandfahered, and redundant if (!initialLanguageMap.containsKey(preferred)) { sb = new StringBuilder(preferred); sb.append(','); @@ -131,7 +150,12 @@ private static void generateEquivalentMap() { String[] subtags; for (String preferred : initialLanguageMap.keySet()) { - subtags = initialLanguageMap.get(preferred).toString().split(","); + // There are cases where the same tag may appear in two entries, e.g., + // "yue" is defined both as extlang and redundant. Remove the dup. + subtags = Arrays.stream(initialLanguageMap.get(preferred).toString().split(",")) + .distinct() + .collect(Collectors.toList()) + .toArray(new String[0]); if (subtags.length == 2) { sortedLanguageMap1.put(subtags[0], subtags[1]); --- old/test/jdk/java/util/Locale/Bug7069824.java 2020-04-06 12:13:29.000000000 -0700 +++ new/test/jdk/java/util/Locale/Bug7069824.java 2020-04-06 12:13:29.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 7069824 8042360 8032842 8175539 8210443 + * @bug 7069824 8042360 8032842 8175539 8210443 8242010 * @summary Verify implementation for Locale matching. * @run testng/othervm Bug7069824 */ @@ -118,9 +118,10 @@ new LanguageRange("hak-CN", 0.8), new LanguageRange("zh-hakka-CN", 0.8), new LanguageRange("i-hak-CN", 0.8), + new LanguageRange("zh-hak-CN", 0.8), new LanguageRange("cmn-CN", 0.1), - new LanguageRange("zh-cmn-CN", 0.1), - new LanguageRange("zh-guoyu-CN", 0.1))}, + new LanguageRange("zh-guoyu-CN", 0.1), + new LanguageRange("zh-cmn-CN", 0.1))}, {"Accept-Language: rki;q=0.4, no-bok-NO;q=0.9, ccq;q=0.5", List.of(new LanguageRange("no-bok-no", 0.9), new LanguageRange("nb-no", 0.9), --- old/test/jdk/java/util/Locale/Bug8040211.java 2020-04-06 12:13:30.000000000 -0700 +++ new/test/jdk/java/util/Locale/Bug8040211.java 2020-04-06 12:13:30.000000000 -0700 @@ -23,9 +23,9 @@ /* * @test - * @bug 8040211 8191404 8203872 8222980 8225435 8241082 + * @bug 8040211 8191404 8203872 8222980 8225435 8241082 8242010 * @summary Checks the IANA language subtag registry data update - * (LSR Revision: 2020-03-16) with Locale and Locale.LanguageRange + * (LSR Revision: 2020-04-01) with Locale and Locale.LanguageRange * class methods. * @run main Bug8040211 */ @@ -43,9 +43,9 @@ static boolean err = false; private static final String ACCEPT_LANGUAGE = - "Accept-Language: aam, adp, aog, aue, bcg, cey, cqu, dif, ema," - + " en-gb-oed, gti, kdz, koj, kwq, kxe, lii, lmm, lsn, lsv, lvi, mtm," - + " ngv, nns, oyb, phr, pnd, pub, snz, suj, szy,taj, tjj, tjp, tvx," + "Accept-Language: aam, adp, aog, aue, bcg, bpp, cey, cnp, cqu, csp, dif, dmw, ema," + + " en-gb-oed, gti, kdz, koj, kru, kwq, kxe, kzk, lii, lmm, lsn, lsv, lvi, mtm," + + " ngv, nns, oyb, phr, pnd, pub, scv, snz, suj, szy, taj, tjj, tjp, tvx," + " uss, uth, wkr;q=0.9, ar-hyw;q=0.8, yug;q=0.5, gfx;q=0.4"; private static final List EXPECTED_RANGE_LIST = List.of( new LanguageRange("aam", 1.0), @@ -58,11 +58,19 @@ new LanguageRange("ktz", 1.0), new LanguageRange("bcg", 1.0), new LanguageRange("bgm", 1.0), + new LanguageRange("bpp", 1.0), + new LanguageRange("nxu", 1.0), new LanguageRange("cey", 1.0), + new LanguageRange("cnp", 1.0), + new LanguageRange("zh-cnp", 1.0), new LanguageRange("cqu", 1.0), new LanguageRange("quh", 1.0), + new LanguageRange("csp", 1.0), + new LanguageRange("zh-csp", 1.0), new LanguageRange("dif", 1.0), new LanguageRange("dit", 1.0), + new LanguageRange("dmw", 1.0), + new LanguageRange("xrq", 1.0), new LanguageRange("ema", 1.0), new LanguageRange("uok", 1.0), new LanguageRange("en-gb-oed", 1.0), @@ -73,16 +81,23 @@ new LanguageRange("ncp", 1.0), new LanguageRange("koj", 1.0), new LanguageRange("kwv", 1.0), + new LanguageRange("kru", 1.0), + new LanguageRange("kxl", 1.0), new LanguageRange("kwq", 1.0), new LanguageRange("yam", 1.0), new LanguageRange("kxe", 1.0), new LanguageRange("tvd", 1.0), + new LanguageRange("kzk", 1.0), + new LanguageRange("gli", 1.0), + new LanguageRange("drr", 1.0), new LanguageRange("lii", 1.0), new LanguageRange("raq", 1.0), new LanguageRange("lmm", 1.0), new LanguageRange("rmx", 1.0), new LanguageRange("lsn", 1.0), + new LanguageRange("sgn-lsn", 1.0), new LanguageRange("lsv", 1.0), + new LanguageRange("sgn-lsv", 1.0), new LanguageRange("lvi", 1.0), new LanguageRange("mtm", 1.0), new LanguageRange("ymt", 1.0), @@ -99,6 +114,8 @@ new LanguageRange("pnd", 1.0), new LanguageRange("pub", 1.0), new LanguageRange("puz", 1.0), + new LanguageRange("scv", 1.0), + new LanguageRange("zir", 1.0), new LanguageRange("snz", 1.0), new LanguageRange("asd", 1.0), new LanguageRange("suj", 1.0), --- old/test/jdk/java/util/Locale/LSRDataTest.java 2020-04-06 12:13:31.000000000 -0700 +++ new/test/jdk/java/util/Locale/LSRDataTest.java 2020-04-06 12:13:31.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8204938 + * @bug 8204938 8242010 * @summary Checks the IANA language subtag registry data update * with Locale.LanguageRange parse method. * @run main LSRDataTest @@ -100,7 +100,8 @@ private static void loadLSRData(Path path) throws IOException { String type = null; String tag = null; - String preferred; + String preferred = null; + String prefix = null; for (String line : Files.readAllLines(path, Charset.forName("UTF-8"))) { line = line.toLowerCase(Locale.ROOT); @@ -109,20 +110,36 @@ type = line.substring(index); } else if (line.startsWith("tag:") || line.startsWith("subtag:")) { tag = line.substring(index); - } else if (line.startsWith("preferred-value:") && !type.equals("extlang")) { + } else if (line.startsWith("preferred-value:")) { preferred = line.substring(index); - processDataAndGenerateMaps(type, tag, preferred); + } else if (line.startsWith("prefix:")) { + prefix = line.substring(index); } else if (line.equals("%%")) { + processDataAndGenerateMaps(type, tag, preferred, prefix); type = null; tag = null; + preferred = null; + prefix = null; } } + + // Last entry + processDataAndGenerateMaps(type, tag, preferred, prefix); } private static void processDataAndGenerateMaps(String type, String tag, - String preferred) { - StringBuilder sb; + String preferred, + String prefix) { + + if (type == null || tag == null || preferred == null) { + return; + } + + if (type.equals("extlang") && prefix != null) { + tag = prefix + "-" + tag; + } + if (type.equals("region") || type.equals("variant")) { if (!regionVariantEquivMap.containsKey(preferred)) { String tPref = HYPHEN + preferred; @@ -134,7 +151,7 @@ + " A region/variant subtag \"" + preferred + "\" is registered for more than one subtags."); } - } else { // language, grandfathered, and redundant + } else { // language, extlang, grandfathered, and redundant if (!singleLangEquivMap.containsKey(preferred) && !multiLangEquivsMap.containsKey(preferred)) { // new entry add it into single equiv map