The CLDR provides a repository of locale data. In Java, you can access a list of CLDR month abbreviations for a given locale, as follows:
String[] usMonthAbbrevs = new DateFormatSymbols(Locale.US).getShortMonths();
System.out.println(usMonthAbbrevs[0]);
The above (in Java 17, using the default CLDR provider) prints Jan
.
I have been assuming (maybe wrongly) that this list of abbreviations is defined in the relevant CLDR XML file for the en
locale:
cldr
> common
> main
> en.xml
> <month type="1">Jan</month>
But for Canadian English, the same month abbreviations all have periods at the end:
String[] canMonthAbbrevs = new DateFormatSymbols(Locale.CANADA).getShortMonths();
System.out.println(canMonthAbbrevs[0]);
The above prints Jan.
- note that period at the end.
Question: Where is the CLDR list, or rule, which specifies this extra period for the en_CA
locale?
I did not see anything obvious in the en_CA.xml
file. Maybe I missed it, or I did not understand what I was looking at.
To research this, I tried to trace the code back through Java's resource bundle classes.
This led me to the following class:
sun.text.resources.cldr.ext.FormatData_en_CA
I found this class in my Java installation in jmods/jdk.localedata.jmod
. After unzipping that jmod
file, I opened the following class file:
classes/sun/text/resources/cldr/ext/FormatData_en_CA.class
In there, I saw bytecode which contains the month abbreviations with periods - for example:
* 7: ldc #9 // String Jan.
My guess is that all the classes in jdk.localedata.jmod
are pre-built (presumably from CLDR data/rules). But I was not able to see how that process happens. Maybe a tool which is part of the JDK build process?
So, my question remains: Where is the CLDR list, or rule, which specifies this extra period for the en_CA
locale's month abbreviations?
Why am I asking? Just because I got curious about this, after noticing the difference between the US and Canadian abbreviations.
You got the wrong version. Java 17 supports CLDR 39, not 41. If you look at the version-39 en_CA.xml file, you can clearly see them all laid out there:
<monthWidth type="abbreviated">
<month type="1">Jan.</month>
<month type="2">Feb.</month>
<month type="3">Mar.</month>
<month type="4">Apr.</month>
<month type="5">May</month>
<month type="6">Jun.</month>
<month type="7">Jul.</month>
<month type="8">Aug.</month>
<month type="9">Sep.</month>
<month type="10">Oct.</month>
<month type="11">Nov.</month>
<month type="12">Dec.</month>
</monthWidth>
Evidently, in newer versions, this trailing dot is removed :)