-
Notifications
You must be signed in to change notification settings - Fork 384
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CLDR-8823 Don't use Jan, Feb, for non-gregorian calendar systems #3861
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -20,7 +20,11 @@ | |
%L = (long|short|narrow) | ||
%M = (Alaska_Hawaii|Bering|Dominican|Goose_Bay|Greenland_Central|Dutch_Guiana|Africa_FarWestern|Liberia|British|Irish|Kuybyshev|Sverdlovsk|Baku|Tbilisi|Turkey|Yerevan|Aktyubinsk|Ashkhabad|Dushanbe|Frunze|Kizilorda|Oral|Samarkand|Shevchenko|Tashkent|Uralsk|Urumqi|Dacca|Karachi|Borneo|Malaya|Kwajalein) | ||
%N = (gregorian|generic|buddhist|chinese|coptic|dangi|ethiopic|hebrew|indian|islamic|japanese|persian|roc) | ||
%O = (gregorian|chinese|coptic|dangi|ethiopic|hebrew|indian|islamic|persian) | ||
# calendar systems that should use Gregorian months (just Gregorian) | ||
# We don't list roc, etc here because their months are hidden. | ||
%G = (gregorian) | ||
# all others use M## form months. | ||
%O = (chinese|coptic|dangi|ethiopic|hebrew|indian|islamic|persian) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This isn't working, I think, because what we want is that every calendar falls into one of these groups.
Because we NEVER want to miss a calendar, exactly one of these groups should be "any", and that needs to come last. That should not be the Hidden one, because we want to be safe, and better to show a calendar that we shouldn't, than hide a calendar that should be shown. So it should be: So all the calendars that should be hidden...%XXX... all the calendars that should use M1...%O... all the calendars that should use Jan...%A... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you detail what "isn't working"? |
||
%P = (future|past) | ||
%R = (gregorian|buddhist|coptic|ethiopic|ethiopic-amete-alem|hebrew|indian|islamic|japanese|persian|roc) | ||
%S = ([^/]*+) | ||
|
@@ -82,10 +86,14 @@ | |
//ldml/dates/calendars/calendar[@type="gregorian"]/quarters/quarterContext[@type="%A"]/quarterWidth[@type="%A"]/quarter[@type="%A"] ; DateTime ; &calendar(gregorian) ; &calField(Quarters:$2:$1) ; $3 | ||
//ldml/dates/calendars/calendar[@type="%A"]/quarters/quarterContext[@type="%A"]/quarterWidth[@type="%A"]/quarter[@type="%A"] ; Special ; Suppress ; &calendar($1) ; &calField(Quarters:$3:$2)-$4 ; HIDE | ||
|
||
//ldml/dates/calendars/calendar[@type="%O"]/months/monthContext[@type="%A"]/monthWidth[@type="%A"]/month[@type="%A"][@yeartype="%A"] ; DateTime ; &calendar($1) ; &calField(Months:$3:$2) ; &month($4) (leap) | ||
//ldml/dates/calendars/calendar[@type="%O"]/months/monthContext[@type="%A"]/monthWidth[@type="%A"]/month[@type="%A"] ; DateTime ; &calendar($1) ; &calField(Months:$3:$2) ; &month($4) | ||
//ldml/dates/calendars/calendar[@type="%A"]/months/monthContext[@type="%A"]/monthWidth[@type="%A"]/month[@type="%A"][@yeartype="%A"] ; Special ; Suppress ; &calendar($1) ; &calField(Months:$3:$2)-&month($4) (leap) ; HIDE | ||
//ldml/dates/calendars/calendar[@type="%A"]/months/monthContext[@type="%A"]/monthWidth[@type="%A"]/month[@type="%A"] ; Special ; Suppress ; &calendar($1) ; &calField(Months:$3:$2)-&month($4) ; HIDE | ||
# months that follow Gregorian - %G | ||
//ldml/dates/calendars/calendar[@type="%G"]/months/monthContext[@type="%A"]/monthWidth[@type="%A"]/month[@type="%A"][@yeartype="%A"] ; DateTime ; &calendar($1) ; &calField(Months:$3:$2) ; &month($4) (leap) | ||
//ldml/dates/calendars/calendar[@type="%G"]/months/monthContext[@type="%A"]/monthWidth[@type="%A"]/month[@type="%A"] ; DateTime ; &calendar($1) ; &calField(Months:$3:$2) ; &month($4) | ||
# All others just use "M#" form | ||
//ldml/dates/calendars/calendar[@type="%O"]/months/monthContext[@type="%A"]/monthWidth[@type="%A"]/month[@type="%A"][@yeartype="%A"] ; DateTime ; &calendar($1) ; &calField(Months:$3:$2) ; M$4 (leap) | ||
//ldml/dates/calendars/calendar[@type="%O"]/months/monthContext[@type="%A"]/monthWidth[@type="%A"]/month[@type="%A"] ; DateTime ; &calendar($1) ; &calField(Months:$3:$2) ; M$4 | ||
//ldml/dates/calendars/calendar[@type="%A"]/months/monthContext[@type="%A"]/monthWidth[@type="%A"]/month[@type="%A"][@yeartype="%A"] ; Special ; Suppress ; &calendar($1) ; &calField(Months:$3:$2)-M$4 (leap) ; HIDE | ||
//ldml/dates/calendars/calendar[@type="%A"]/months/monthContext[@type="%A"]/monthWidth[@type="%A"]/month[@type="%A"] ; Special ; Suppress ; &calendar($1) ; &calField(Months:$3:$2)-M$4 ; HIDE | ||
|
||
//ldml/dates/calendars/calendar[@type="gregorian"]/days/dayContext[@type="%A"]/dayWidth[@type="%A"]/day[@type="%A"] ; DateTime ; &calendar(gregorian) ; &calField(Days:$2:$1) ; &day($3) | ||
//ldml/dates/calendars/calendar[@type="%A"]/days/dayContext[@type="%A"]/dayWidth[@type="%A"]/day[@type="%A"] ; Special ; Suppress ; &calendar($1) ; &calField(Days:$3:$2)-&day($4) ; HIDE | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
import static org.junit.jupiter.api.Assertions.assertEquals; | ||
import static org.junit.jupiter.api.Assertions.assertNotEquals; | ||
import static org.junit.jupiter.api.Assertions.assertTrue; | ||
|
||
import org.junit.jupiter.api.Test; | ||
import org.unicode.cldr.util.*; | ||
|
||
public class TestPathHeader { | ||
static final String GREGORIAN = "gregorian"; | ||
|
||
@Test | ||
public void TestNonGregorianMonths() { | ||
CLDRFile english = CLDRConfig.getInstance().getCldrFactory().make("en", true); | ||
PathHeader.Factory phf = PathHeader.getFactory(null); | ||
for (final String xpath : english.fullIterable()) { | ||
// skip unless a month name | ||
if (!xpath.startsWith("//ldml/dates/calendars/calendar")) continue; | ||
if (!xpath.contains("/month[")) continue; | ||
final PathHeader ph = phf.fromPath(xpath); | ||
final String value = english.getStringValue(xpath); | ||
// skip any null values. | ||
if (value == null) continue; | ||
// skip any hidden items | ||
final XPathParts xpp = XPathParts.getFrozenInstance(xpath); | ||
final String calType = xpp.getAttributes(3).get("type"); | ||
// we skip Gregorian itself. | ||
if (calType.equals(GREGORIAN)) continue; | ||
// now, we need Gregorian for comparison. | ||
final String gregopath = | ||
xpp.cloneAsThawed().setAttribute("calendar", "type", GREGORIAN).toString(); | ||
final String gregovalue = english.getStringValue(gregopath); | ||
final PathHeader gph = phf.fromPath(gregopath); | ||
if (gph.shouldHide()) continue; // hide if the *gregorian* is hidden. | ||
|
||
if (gregovalue != null && value.equals(gregovalue)) { | ||
// The month name is the same as the Gregorian. So we assume the codes will be the | ||
// same. | ||
if (!ph.shouldHide()) | ||
assertEquals( | ||
ph.getCode(), | ||
gph.getCode(), | ||
() -> | ||
"Expected the same PathHeader code" | ||
+ ph | ||
+ " as Gregorian " | ||
+ gph | ||
+ " for xpath " | ||
+ xpath | ||
+ " because the month " | ||
+ value | ||
+ " was the same as gregorian " | ||
+ gregopath); | ||
assertTrue( | ||
ph.shouldHide(), | ||
() -> | ||
"Should be hidden. To fix: remove " | ||
+ calType | ||
+ " from the %G line of PathHeader.txt."); | ||
} else { | ||
assertNotEquals( | ||
ph.getCode(), | ||
gph.getCode(), | ||
() -> | ||
"Expected a different PathHeader code from Gregorian for xpath " | ||
+ xpath | ||
+ " because the month " | ||
+ value | ||
+ " was the differnet from gregorian " | ||
+ gregovalue | ||
+ "."); | ||
} | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should support not only gregorian, but also gregorian-based calendars. (Those that use the same 12 month solar calendar: Thai Buddhist, Julian, etc.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here are the calendars. Unfortunately, we don't have data here as to which is gregorian-based.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I ran a quick check, and it appears that the following are gregorian-based:
[gregoriy, iso8601, buddhist, japanese, roc]
Also filed a ticket to add metadata to cldr, so that this can be unhardcoded
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So actually it seems the pre existing "intent" was to hide those so that you don't have a Japanese month January with a different translation than Gregorian January. That mystified me too but I think that's why %G is just one and not the others
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@pedberg-icu should also weigh in on this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If it's here, then it's visible for editing. Do we want users giving a different translation for January in 8601 than for gregorian?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@macchiati Specifically, this PR does not make any changes to the visibility (HIDE) or textual content for these calendars:
iso8601, buddhist, japanese, roc
.All that it does is change the following calendars to no longer have month codes based on Gregorian:
chinese|coptic|dangi|ethiopic|hebrew|indian|islamic|persian