Skip to content

[Native Image] Localized data/time data not working in native image #12394

@Eng-Fouad

Description

@Eng-Fouad

Describe the Issue

Given this sample:

final var ARABIC_GREGORIAN_DATE_FORMATTER = DateTimeFormatter.ofPattern("EEEE dd\\MM\\yyyy G").localizedBy(Locale.forLanguageTag("ar"));
final var ENGLISH_GREGORIAN_DATE_FORMATTER = DateTimeFormatter.ofPattern("EEEE dd/MM/yyyy G").localizedBy(Locale.ENGLISH);

var now = Instant.now();
String arabicGregorianDate = ARABIC_GREGORIAN_DATE_FORMATTER.format(now.atZone(ZoneId.systemDefault()));
String englishGregorianDate = ENGLISH_GREGORIAN_DATE_FORMATTER.format(now.atZone(ZoneId.systemDefault()));

Log.info("arabicGregorianDate = " + arabicGregorianDate);
Log.info("englishGregorianDate = " + englishGregorianDate);

When running in JVM mode, I get this output:

arabicGregorianDate = السبت 18\10\2025 م
englishGregorianDate = Saturday 18/10/2025 AD

However, when I compile it to GraalVM native-image and run it, I get this output:

arabicGregorianDate = Sat 18\10\2025 CE
englishGregorianDate = Saturday 18/10/2025 AD

Notice that Arabic word for Saturday السبت is fallbacked to Sat and م to CE?

I am using -H:IncludeLocales=ar,en as well.

I added the option -H:+TraceLocalizationFeature and I noticed the resource bundle sun.text.resources.cldr.FormatData with locale ar is included in native image (but does not work):

Adding bundle sun.util.resources.cldr.CalendarData, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.cldr.CurrencyNames, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.cldr.LocaleNames, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.cldr.TimeZoneNames, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.cldr.FormatData, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.cldr.FormatData, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.cldr.CalendarData, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.cldr.CurrencyNames, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.cldr.LocaleNames, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.cldr.TimeZoneNames, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.cldr.FormatData, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.cldr.FormatData, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.cldr.CalendarData, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.cldr.CurrencyNames, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.cldr.LocaleNames, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.cldr.TimeZoneNames, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.cldr.FormatData, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.cldr.FormatData, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.cldr.CalendarData, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.cldr.CurrencyNames, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.cldr.LocaleNames, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.cldr.TimeZoneNames, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.cldr.FormatData, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.cldr.FormatData, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.CalendarData, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.CurrencyNames, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.LocaleNames, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.TimeZoneNames, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.BreakIteratorInfo, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.BreakIteratorResources, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.CollationData, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.FormatData, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.FormatData, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.CalendarData, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.CurrencyNames, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.LocaleNames, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.TimeZoneNames, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.BreakIteratorInfo, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.BreakIteratorResources, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.CollationData, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.FormatData, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.FormatData, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.CalendarData, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.CurrencyNames, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.LocaleNames, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.TimeZoneNames, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.BreakIteratorInfo, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.BreakIteratorResources, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.CollationData, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.FormatData, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.FormatData, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.CalendarData, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.CurrencyNames, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.LocaleNames, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.resources.TimeZoneNames, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.BreakIteratorInfo, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.BreakIteratorResources, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.CollationData, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.FormatData, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.text.resources.FormatData, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.logging.resources.logging, locale  with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.logging.resources.logging, locale ar with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.logging.resources.logging, locale en_US with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)
Adding bundle sun.util.logging.resources.logging, locale en with condition ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true)

Using the latest version of GraalVM can resolve many issues.

GraalVM Version

25

Operating System and Version

Windows 11

Troubleshooting Confirmation

Run Command

.

Expected Behavior

.

Actual Behavior

.

Steps to Reproduce

Reproducer: https://github.com/Eng-Fouad/graal-native-date-locale

Additional Context

No response

Run-Time Log Output and Error Messages

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions