Skip to content

Commit 1ad583f

Browse files
authored
CLDR-18144 Menu attributes for languages: core & extension (#4585)
1 parent 0c1425a commit 1ad583f

File tree

9 files changed

+110
-3
lines changed

9 files changed

+110
-3
lines changed

common/dtd/ldml.dtd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic
6464
<!--@MATCH:validity/locale-for-names-->
6565
<!ATTLIST language alt NMTOKENS #IMPLIED >
6666
<!--@MATCH:literal/long, secondary, short, variant, menu, official-->
67+
<!ATTLIST language menu NMTOKENS #IMPLIED >
68+
<!--@MATCH:literal/core, extension-->
6769
<!ATTLIST language draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
6870
<!--@METADATA-->
6971
<!--@DEPRECATED:true, false-->

common/main/en.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ annotations.
133133
<language type="chy">Cheyenne</language>
134134
<language type="cic">Chickasaw</language>
135135
<language type="ckb">Central Kurdish</language>
136+
<language type="ckb" menu="core">Kurdish</language>
137+
<language type="ckb" menu="extension">Central</language>
136138
<language type="ckb" alt="menu">Kurdish, Central</language>
137139
<language type="ckb" alt="variant">Kurdish, Sorani</language>
138140
<language type="clc">Chilcotin</language>
@@ -348,6 +350,8 @@ annotations.
348350
<language type="ksf">Bafia</language>
349351
<language type="ksh">Colognian</language>
350352
<language type="ku">Kurdish</language>
353+
<language type="ku" menu="core">Kurdish</language>
354+
<language type="ku" menu="extension">Kurmanji</language>
351355
<language type="kum">Kumyk</language>
352356
<language type="kut">Kutenai</language>
353357
<language type="kv">Komi</language>
@@ -547,6 +551,8 @@ annotations.
547551
<language type="sd">Sindhi</language>
548552
<language type="sdc">Sassarese Sardinian</language>
549553
<language type="sdh">Southern Kurdish</language>
554+
<language type="sdh" menu="core">Kurdish</language>
555+
<language type="sdh" menu="extension">Southern</language>
550556
<language type="se">Northern Sami</language>
551557
<language type="se" alt="menu">Sami, Northern</language>
552558
<language type="see">Seneca</language>

common/supplemental/coverageLevels.xml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,21 @@ For terms of use, see http://www.unicode.org/copyright.html
254254
<coverageLevel value="basic" match="localeDisplayNames/codePatterns/codePattern[@type='(language|script|territory)']"/>
255255

256256
<coverageLevel value="basic" match="localeDisplayNames/languages/language[@type='${Target-Language}']"/>
257+
<coverageLevel value="basic" match="localeDisplayNames/languages/language[@type='${Target-Language}'][@menu='%anyAttribute']"/>
257258
<coverageLevel value="basic" match="localeDisplayNames/languages/language[@type='${Target-Language}'][@alt='%anyAttribute']"/>
259+
<coverageLevel value="basic" match="localeDisplayNames/languages/language[@type='${Target-Language}'][@alt='%anyAttribute'][@menu='%anyAttribute']"/>
258260
<coverageLevel value="basic" match="localeDisplayNames/languages/language[@type='en']"/>
261+
<coverageLevel value="basic" match="localeDisplayNames/languages/language[@type='en'][@menu='%anyAttribute']"/>
259262
<coverageLevel value="basic" match="localeDisplayNames/languages/language[@type='en'][@alt='%anyAttribute']"/>
263+
<coverageLevel value="basic" match="localeDisplayNames/languages/language[@type='en'][@alt='%anyAttribute'][@menu='%anyAttribute']"/>
260264
<coverageLevel value="moderate" match="localeDisplayNames/languages/language[@type='%language30']"/>
265+
<coverageLevel value="moderate" match="localeDisplayNames/languages/language[@type='%language30'][@menu='%anyAttribute']"/>
261266
<coverageLevel value="moderate" match="localeDisplayNames/languages/language[@type='%language30'][@alt='%anyAttribute']"/>
267+
<coverageLevel value="moderate" match="localeDisplayNames/languages/language[@type='%language30'][@alt='%anyAttribute'][@menu='%anyAttribute']"/>
262268
<coverageLevel value="moderate" match="localeDisplayNames/languages/language[@type='%language40']"/>
269+
<coverageLevel value="moderate" match="localeDisplayNames/languages/language[@type='%language40'][@menu='%anyAttribute']"/>
263270
<coverageLevel value="moderate" match="localeDisplayNames/languages/language[@type='%language40'][@alt='%anyAttribute']"/>
271+
<coverageLevel value="moderate" match="localeDisplayNames/languages/language[@type='%language40'][@alt='%anyAttribute'][@menu='%anyAttribute']"/>
264272

265273
<coverageLevel value="basic" match="localeDisplayNames/scripts/script[@type='${Target-Scripts}']"/>
266274
<coverageLevel value="moderate" match="localeDisplayNames/scripts/script[@type='%script30']"/>
@@ -706,21 +714,37 @@ For terms of use, see http://www.unicode.org/copyright.html
706714
<coverageLevel value="moderate" inTerritory="TW" match="dates/calendars/calendar[@type='roc']/dateFormats/dateFormatLength[@type='%dateTimeFormatLengths']/dateFormat%stdPattern"/>
707715

708716
<coverageLevel value="moderate" match="localeDisplayNames/languages/language[@type='%language60']"/>
717+
<coverageLevel value="moderate" match="localeDisplayNames/languages/language[@type='%language60'][@menu='%anyAttribute']"/>
709718
<coverageLevel value="moderate" match="localeDisplayNames/languages/language[@type='%language60'][@alt='%anyAttribute']"/>
719+
<coverageLevel value="moderate" match="localeDisplayNames/languages/language[@type='%language60'][@alt='%anyAttribute'][@menu='%anyAttribute']"/>
710720
<coverageLevel inTerritory="CF" value="moderate" match="localeDisplayNames/languages/language[@type='sg']"/>
721+
<coverageLevel inTerritory="CF" value="moderate" match="localeDisplayNames/languages/language[@type='sg'][@menu='%anyAttribute']"/>
711722
<coverageLevel inTerritory="CF" value="moderate" match="localeDisplayNames/languages/language[@type='sg'][@alt='%anyAttribute']"/>
723+
<coverageLevel inTerritory="CF" value="moderate" match="localeDisplayNames/languages/language[@type='sg'][@alt='%anyAttribute'][@menu='%anyAttribute']"/>
712724
<coverageLevel inTerritory="CG" value="moderate" match="localeDisplayNames/languages/language[@type='(kg|ln)']"/>
725+
<coverageLevel inTerritory="CG" value="moderate" match="localeDisplayNames/languages/language[@type='(kg|ln)'][@menu='%anyAttribute']"/>
713726
<coverageLevel inTerritory="CG" value="moderate" match="localeDisplayNames/languages/language[@type='(kg|ln)'][@alt='%anyAttribute']"/>
727+
<coverageLevel inTerritory="CG" value="moderate" match="localeDisplayNames/languages/language[@type='(kg|ln)'][@alt='%anyAttribute'][@menu='%anyAttribute']"/>
714728
<coverageLevel inTerritory="CM" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_CM']"/>
729+
<coverageLevel inTerritory="CM" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_CM'][@menu='%anyAttribute']"/>
715730
<coverageLevel inTerritory="CM" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_CM'][@alt='%anyAttribute']"/>
731+
<coverageLevel inTerritory="CM" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_CM'][@alt='%anyAttribute'][@menu='%anyAttribute']"/>
716732
<coverageLevel inTerritory="EU" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_EU']"/>
733+
<coverageLevel inTerritory="EU" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_EU'][@menu='%anyAttribute']"/>
717734
<coverageLevel inTerritory="EU" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_EU'][@alt='%anyAttribute']"/>
735+
<coverageLevel inTerritory="EU" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_EU'][@alt='%anyAttribute'][@menu='%anyAttribute']"/>
718736
<coverageLevel inTerritory="GA" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_GA']"/>
737+
<coverageLevel inTerritory="GA" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_GA'][@menu='%anyAttribute']"/>
719738
<coverageLevel inTerritory="GA" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_GA'][@alt='%anyAttribute']"/>
739+
<coverageLevel inTerritory="GA" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_GA'][@alt='%anyAttribute'][@menu='%anyAttribute']"/>
720740
<coverageLevel inTerritory="NG" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_NG']"/>
741+
<coverageLevel inTerritory="NG" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_NG'][@menu='%anyAttribute']"/>
721742
<coverageLevel inTerritory="NG" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_NG'][@alt='%anyAttribute']"/>
743+
<coverageLevel inTerritory="NG" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_NG'][@alt='%anyAttribute'][@menu='%anyAttribute']"/>
722744
<coverageLevel inTerritory="TD" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_TD']"/>
745+
<coverageLevel inTerritory="TD" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_TD'][@menu='%anyAttribute']"/>
723746
<coverageLevel inTerritory="TD" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_TD'][@alt='%anyAttribute']"/>
747+
<coverageLevel inTerritory="TD" value="moderate" match="localeDisplayNames/languages/language[@type='%language60_TD'][@alt='%anyAttribute'][@menu='%anyAttribute']"/>
724748
<coverageLevel value="moderate" match="localeDisplayNames/scripts/script[@type='%script60']"/>
725749
<coverageLevel value="moderate" match="localeDisplayNames/territories/territory[@type='%territory60']"/>
726750
<coverageLevel inTerritory="EU" value="moderate" match="localeDisplayNames/territories/territory[@type='%territory60_EU']"/>
@@ -1041,7 +1065,9 @@ For terms of use, see http://www.unicode.org/copyright.html
10411065
<coverageLevel value="moderate" match="units/unitLength[@type='%unitLengths']/coordinateUnit/displayName"/>
10421066

10431067
<coverageLevel value="modern" match="localeDisplayNames/languages/language[@type='%language80']"/>
1068+
<coverageLevel value="modern" match="localeDisplayNames/languages/language[@type='%language80'][@menu='%anyAttribute']"/>
10441069
<coverageLevel value="modern" match="localeDisplayNames/languages/language[@type='%language80'][@alt='%anyAttribute']"/>
1070+
<coverageLevel value="modern" match="localeDisplayNames/languages/language[@type='%language80'][@alt='%anyAttribute'][@menu='%anyAttribute']"/>
10451071
<coverageLevel value="modern" match="localeDisplayNames/scripts/script[@type='%script80']"/>
10461072
<coverageLevel value="modern" match="localeDisplayNames/scripts/script[@type='%script80'][@alt='%anyAttribute']"/>
10471073
<coverageLevel value="modern" match="localeDisplayNames/keys/key[@type='%anyAttribute']"/>

tools/cldr-code/src/main/java/org/unicode/cldr/test/CheckDisplayCollisions.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,20 @@ public CheckCLDR handleCheck(
515515
}
516516
}
517517
}
518+
if (myType == Type.LANGUAGE) {
519+
// We remove anything with @menu from the collision set.
520+
// TBD
521+
// If menu=core + "|" + menu=extension is equal for two DIFFERENT language codes,
522+
// then there is a collision.
523+
// But we have to add a special mechanism to detect that.
524+
Iterator<String> iterator = paths.iterator();
525+
while (iterator.hasNext()) {
526+
String curPath = iterator.next();
527+
if (curPath.contains("[@menu")) {
528+
iterator.remove();
529+
}
530+
}
531+
}
518532

519533
// Collisions between different lengths and counts of the same unit are allowed
520534
// Collisions between 'narrow' forms are allowed (the current is filtered by UNITS_IGNORE)
@@ -597,7 +611,7 @@ public CheckCLDR handleCheck(
597611

598612
// removeMatches(myType);
599613
// check again on size
600-
if (paths.isEmpty()) {
614+
if (paths.size() <= 1) {
601615
return this;
602616
}
603617

tools/cldr-code/src/main/java/org/unicode/cldr/test/ExampleGenerator.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3291,7 +3291,6 @@ private void handleDisplayNames(
32913291
getLocaleDisplayPattern("localeKeyTypePattern", element, value);
32923292
String localePattern = getLocaleDisplayPattern("localePattern", element, value);
32933293
String localeSeparator = getLocaleDisplayPattern("localeSeparator", element, value);
3294-
32953294
List<String> locales = new ArrayList<>();
32963295
if (element.equals("localePattern")) {
32973296
locales.add("uz-AF");
@@ -3329,6 +3328,34 @@ private void handleDisplayNames(
33293328
return;
33303329
} else {
33313330
value = setBackground(value);
3331+
3332+
String menuAttr = parts.getAttributeValue(-1, "menu");
3333+
if (menuAttr != null) { // show core plus extension
3334+
String core, extension;
3335+
XPathParts other = parts.cloneAsThawed();
3336+
switch (menuAttr) {
3337+
case "core":
3338+
core = value;
3339+
extension =
3340+
cldrFile.getStringValue(
3341+
other.setAttribute(-1, "menu", "extension").toString());
3342+
break;
3343+
default:
3344+
core =
3345+
cldrFile.getStringValue(
3346+
other.setAttribute(-1, "menu", "core").toString());
3347+
extension = value;
3348+
break;
3349+
}
3350+
String localePattern =
3351+
getCldrFile()
3352+
.getStringValue(
3353+
"//ldml/localeDisplayNames/localeDisplayPattern/localePattern");
3354+
examples.add(
3355+
invertBackground(MessageFormat.format(localePattern, core, extension)));
3356+
return;
3357+
}
3358+
33323359
String nameType = parts.getElement(3);
33333360

33343361
Map<String, String> likely = supplementalDataInfo.getLikelySubtags();

tools/cldr-code/src/main/java/org/unicode/cldr/util/ExtraPaths.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,12 @@ public class ExtraPaths {
6666
"//ldml/personNames/sampleName[@item=\"foreignFull\"]/nameField[@type=\"surname-core\"]",
6767
"//ldml/personNames/sampleName[@item=\"foreignFull\"]/nameField[@type=\"surname2\"]",
6868
"//ldml/personNames/sampleName[@item=\"foreignFull\"]/nameField[@type=\"generation\"]",
69-
"//ldml/personNames/sampleName[@item=\"foreignFull\"]/nameField[@type=\"credentials\"]"));
69+
"//ldml/personNames/sampleName[@item=\"foreignFull\"]/nameField[@type=\"credentials\"]",
70+
71+
// core/extension for language names (languages at modern or moderate)
72+
73+
"//ldml/localeDisplayNames/languages/language[@type=\"ku\"][@menu=\"core\"]",
74+
"//ldml/localeDisplayNames/languages/language[@type=\"ku\"][@menu=\"extension\"]"));
7075

7176
public static void addConstant(Collection<String> toAddTo) {
7277
toAddTo.addAll(SingletonHelper.INSTANCE.paths);

tools/cldr-code/src/main/resources/org/unicode/cldr/util/data/PathDescriptions.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
^//ldml/localeDisplayNames/territories/territory\[@type="(CD|DG|CG|003|021|ZA|018|FK|MK|MM|TW|HK|MO)"]; ROOT territory; Warning - the region {0} requires special attention! Note: before translating, be sure to read %COUNTRY_NAMES.
4848
^//ldml/localeDisplayNames/scripts/script\[@type="(Z[^"]*)"]; ROOT script; The name of the script (writing system) with Unicode script code = {0}. Note: before translating, be sure to read %SCRIPT_NAMES.
4949
^//ldml/dates/timeZoneNames/zone\[@type="([^"]*)"]/exemplarCity; ROOT timezone; The name of {0}. For more information, see %TZ_CITY_NAMES.
50+
^//ldml/localeDisplayNames/languages/language\[@type="([^"]*)"]\[@menu="([^"]*)"]; ROOT language; The name of the language with Unicode language code = {0}, _and_ menu type = {0}. **Be sure to read about this in %LANGUAGE_NAMES**.
5051
^//ldml/localeDisplayNames/languages/language\[@type="([^"]*)"]; ROOT language; The name of the language with Unicode language code = {0}. For more information, see %LANGUAGE_NAMES.
5152
^//ldml/localeDisplayNames/scripts/script\[@type="([^"]*)"]; ROOT script; The name of the script (writing system) with Unicode script code = {0}. For more information, see %SCRIPT_NAMES.
5253
^//ldml/localeDisplayNames/territories/territory\[@type="([^"]*)"]; ROOT territory; The name of the country or region with Unicode region code = {0}. For more information, see %COUNTRY_NAMES.

tools/cldr-code/src/main/resources/org/unicode/cldr/util/data/PathHeader.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
### Locale Display Names
6363
//ldml/localeDisplayNames/localeDisplayPattern/%E ; Locale Display Names ; Locale Name Patterns ; Locale Formatting ; &localePattern($1)
6464
//ldml/localeDisplayNames/codePatterns/codePattern[@type="%A"] ; Locale Display Names ; Locale Name Patterns ; Locale Field Fallbacks ; $1
65+
//ldml/localeDisplayNames/languages/language[@type="%A"][@menu="%A"] ; Locale Display Names ; &languageSection($1) ; &firstLetter($1) ; &languageSort($1)-$2
6566
//ldml/localeDisplayNames/languages/language[@type="%A"] ; Locale Display Names ; &languageSection($1) ; &firstLetter($1) ; &languageSort($1)
6667
//ldml/localeDisplayNames/scripts/script[@type="%A"] ; Locale Display Names ; Scripts ; &categoryFromScript($1) ; $1
6768
//ldml/localeDisplayNames/territories/territory[@type="%A"] ; Locale Display Names ; &territorySection($1) ; &categoryFromTerritory($1) ; $1

tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestExampleGenerator.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2382,4 +2382,29 @@ public void TestKeyTypeScope() {
23822382
"〖❬Sort Order❭〗〖❬   others…❭〗〖❬   ❭Dictionary〗〖❬   …others❭〗〖❬Sort Order: ❭Dictionary〗",
23832383
sactual);
23842384
}
2385+
2386+
public void testLanguageMenuAttributes() {
2387+
String[][] tests = {
2388+
{
2389+
"//ldml/localeDisplayNames/languages/language[@type=\"ku\"][@menu=\"core\"]",
2390+
"〖Kurdish❬ (Kurmanji)❭〗"
2391+
},
2392+
{
2393+
"//ldml/localeDisplayNames/languages/language[@type=\"ku\"][@menu=\"extension\"]",
2394+
"〖❬Kurdish (❭Kurmanji❬)❭〗"
2395+
}
2396+
};
2397+
ExampleGenerator eg = getExampleGenerator("en");
2398+
2399+
CLDRFile cldrFile = CLDRConfig.getInstance().getCldrFactory().make("en", true);
2400+
2401+
for (String[] test : tests) {
2402+
String path = test[0];
2403+
String expected = test[1];
2404+
String value = cldrFile.getStringValue(path);
2405+
String exampleHtml = eg.getExampleHtml(path, value);
2406+
String actual = ExampleGenerator.simplify(exampleHtml);
2407+
assertEquals(path, expected, actual);
2408+
}
2409+
}
23852410
}

0 commit comments

Comments
 (0)