arabicGregorianDate = Sat 18\10\2025 CE
englishGregorianDate = Saturday 18/10/2025 AD
Обратите внимание, что арабское слово, обозначающее субботу, السبت заменено на Sat, а م — на CE?
Я предполагаю, что некоторые данные (CLDR?) отсутствуют в собственном изображении и для включения этих данных необходимы некоторые настройки. Как это сделать? Попробовал агент трассировки GraalVM, но это не решило проблему.
Я также использую -H:IncludeLocales=ar,en.
Воспроизводитель: https://github.com/Eng-Fouad/graal-native-date-locale
Изменить:
Я нашел необходимые ресурсы локализации внутри модуля jdk.localedata, в частности, в sun.text.resources.cldr.ext.FormatData_ar.
Однако я пытался добавить их в достижимость-metadata.json, но это не сработало.
Изменить 2:
Я добавил параметр -H:+TraceLocalizationFeature и заметил, что пакет ресурсов sun.text.resources.cldr.FormatData с языковым стандартом ar включен в собственный образ (но не работает):
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)
Не знаю, почему FormatData указан дважды для каждой локали. Также не уверен, что такое условие ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true).
В этом примере: [code]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); [/code] При работе в режиме JVM я получаю следующий результат: [code]arabicGregorianDate = السبت 18\10\2025 م englishGregorianDate = Saturday 18/10/2025 AD [/code] Однако, когда я компилирую его в собственный образ GraalVM и запускаю, я получаю следующий результат: [code]arabicGregorianDate = Sat 18\10\2025 CE englishGregorianDate = Saturday 18/10/2025 AD [/code] Обратите внимание, что арабское слово, обозначающее субботу, السبت заменено на Sat, а م — на CE? Я предполагаю, что некоторые данные (CLDR?) отсутствуют в собственном изображении и для включения этих данных необходимы некоторые настройки. Как это сделать? Попробовал агент трассировки GraalVM, но это не решило проблему. Я также использую -H:IncludeLocales=ar,en. Воспроизводитель: https://github.com/Eng-Fouad/graal-native-date-locale
Изменить: Я нашел необходимые ресурсы локализации внутри модуля jdk.localedata, в частности, в sun.text.resources.cldr.ext.FormatData_ar. Однако я пытался добавить их в достижимость-metadata.json, но это не сработало.
Изменить 2: Я добавил параметр -H:+TraceLocalizationFeature и заметил, что пакет ресурсов sun.text.resources.cldr.FormatData с языковым стандартом ar включен в собственный образ (но не работает): [code]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) [/code] Не знаю, почему FormatData указан дважды для каждой локали. Также не уверен, что такое условие ConfigurationCondition(type=class java.lang.Object, runtimeChecked=true).