Skip to content

deps: float ICU-23262 patch for icu78#64678

Open
Renegade334 wants to merge 1 commit into
nodejs:mainfrom
Renegade334:icu78-iso8601-dates
Open

deps: float ICU-23262 patch for icu78#64678
Renegade334 wants to merge 1 commit into
nodejs:mainfrom
Renegade334:icu78-iso8601-dates

Conversation

@Renegade334

@Renegade334 Renegade334 commented Jul 22, 2026

Copy link
Copy Markdown
Member

Fixes: #63041
Refs: https://unicode-org.atlassian.net/browse/ICU-23262

This fixes a bug in icu78 whereby absent era data causes libicu to bail out of loading subsequent locale data, including month names.

The iso8601 calendar does not contain era names in CLDR 48, but due to an initialization quirk, other fields are going missing in DateTimeFormat output. This is now a much more noticeable issue since certain Temporal objects can only be DateTimeFormat-ed with the iso8601 calendar, and we have had multiple complaints regarding this.

Firefox and Chromium are floating ephemeral patches to the datafile to add the missing era data (https://crrev.com/c/7843156) to bypass this bug. We cannot patch the locale data in our build setup as we use the precompiled ICU data from the sources package, but we can patch out the initialization bug so that the other iso8601 calendar data is intact.

$ JS='new Intl.DateTimeFormat("en-u-ca-iso8601", { dateStyle: "long" }).format()'

$ node -pe "$JS"
2026  22

$ out/Release/node -pe "$JS"
2026 July 22

Patch:

diff -u deps/icu-small/source/i18n/dtfmtsym.cpp tools/icu/patches/78/source/i18n/dtfmtsym.cpp
--- deps/icu-small/source/i18n/dtfmtsym.cpp
+++ tools/icu/patches/78/source/i18n/dtfmtsym.cpp
@@ -2420,7 +2420,7 @@
     initEras(&fEraNames, fEraNamesCount, calendarSink, buildResourcePath(path, gErasTag, gNamesWideTag, status),
             ctebPtr, gNamesWideTag, maxEra, status);
     if (status == U_MISSING_RESOURCE_ERROR) { // Workaround because eras/wide was omitted from CLDR 1.3
-        status = oldStatus;
+        status = U_ZERO_ERROR;
         assignArray(fEraNames, fEraNamesCount, fEras, fErasCount);
     }
     // current ICU4J falls back to abbreviated if narrow eras are missing, so we will too
@@ -2428,7 +2428,7 @@
     initEras(&fNarrowEras, fNarrowErasCount, calendarSink, buildResourcePath(path, gErasTag, gNamesNarrowTag, status),
             ctebPtr, gNamesNarrowTag, maxEra, status);
     if (status == U_MISSING_RESOURCE_ERROR) { // Workaround because eras/wide was omitted from CLDR 1.3
-        status = oldStatus;
+        status = U_ZERO_ERROR;
         assignArray(fNarrowEras, fNarrowErasCount, fEras, fErasCount);
     }

The associated bug is attached to the ICU 79 milestone, so this should hopefully be fixed in the next release.

Signed-off-by: Renegade334 <contact.9a5d6388@renegade334.me.uk>
@nodejs-github-bot nodejs-github-bot added i18n-api Issues and PRs related to the i18n implementation. icu Issues and PRs related to the ICU dependency. needs-ci PRs that need a full CI run. tools Issues and PRs related to the tools directory. labels Jul 22, 2026
@Renegade334 Renegade334 added the lts-watch-v24.x PRs that may need to be released in v24.x label Jul 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

i18n-api Issues and PRs related to the i18n implementation. icu Issues and PRs related to the ICU dependency. lts-watch-v24.x PRs that may need to be released in v24.x needs-ci PRs that need a full CI run. tools Issues and PRs related to the tools directory.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Missing month in Intl.DateTimeFormat output when using calendar: 'iso8601' in Node v24.13.0 and later

2 participants