Локализованные данные/время встроенного образа GraalVMJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Локализованные данные/время встроенного образа GraalVM

Сообщение Anonymous »

В этом примере:

Код: Выделить всё

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);
При работе в режиме JVM я получаю следующий результат:

Код: Выделить всё

arabicGregorianDate = السبت 18\10\2025 م
englishGregorianDate = Saturday 18/10/2025 AD
Однако, когда я компилирую его в собственный образ GraalVM и запускаю, я получаю следующий результат:

Код: Выделить всё

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).

Подробнее здесь: https://stackoverflow.com/questions/797 ... -time-data
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»