0

Javaでローカリゼーションを使用して、日付をローカルスタイルで印刷しようとしました。私はすでに数字と通貨で同様の機能を作成していますが、今日まで同じ動作を適用できませんでした.

数日前にこのトピックを投稿したときに学んだように、ネイティブ モードの GraalVM Quarkus Locale では、ネイティブ モードでローカリゼーションを使用し、「@AutomaticFeature」を作成する必要があります。

このトリックは、数値と通貨に対して機能します。

@AutomaticFeature
public class NativeNumberFormatFeature implements Feature {

    @Override
    public void beforeAnalysis(BeforeAnalysisAccess access) {
        ImageSingletons
                .lookup(RuntimeClassInitializationSupport.class)
                .initializeAtBuildTime(NumberFormatSupport.class, this.getClass().getName());

        ImageSingletons.add(NumberFormatSupport.class, new NumberFormatSupport());
    }

}

public class NumberFormatSupport {

    private Map<Locale, NumberFormat> numberInstancesByLocale;
    private Map<Locale, Map<String, NumberFormat>> currencyInstancesByLocale;

    public NumberFormatSupport() {
        numberInstancesByLocale = new HashMap<>();
        currencyInstancesByLocale = new HashMap<>();
        for (Locale locale : Locale.getAvailableLocales()) {
            numberInstancesByLocale.put(locale, NumberFormat.getNumberInstance(locale));
            currencyInstancesByLocale.put(locale, new HashMap<>());
            for (Currency currency : Currency.getAvailableCurrencies()) {
                currencyInstancesByLocale.get(locale).put(currency.getCurrencyCode(), NumberFormat.getCurrencyInstance(locale));
                currencyInstancesByLocale.get(locale).get(currency.getCurrencyCode()).setCurrency(currency);
            }
        }
    }

    public NumberFormat getNumberFormat(Locale locale) {
        return (NumberFormat) numberInstancesByLocale.get(locale).clone();
    }

    public NumberFormat getCurrencyFormat(Locale locale, Currency currency) {
        return (NumberFormat) currencyInstancesByLocale.get(locale).get(currency.getCurrencyCode()).clone();
    }

}

しかし、 DateTimeFormatter では機能しません:

@AutomaticFeature
public class NativeDateFormatterFeature implements Feature {

    @Override
    public void beforeAnalysis(BeforeAnalysisAccess access) {
        ImageSingletons
                .lookup(RuntimeClassInitializationSupport.class)
                .initializeAtBuildTime(DateFormatterSupport.class, this.getClass().getName());

        ImageSingletons.add(DateFormatterSupport.class, new DateFormatterSupport());
    }
}

public class DateFormatterSupport {

    private Map<Locale, DateTimeFormatter> dateTimeFormatterByLocale;

    public DateFormatterSupport() {
        dateTimeFormatterByLocale = Arrays.stream(Locale.getAvailableLocales()).collect(Collectors.toMap(
            Function.identity(),
            l -> DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(l)));
    }

    public DateTimeFormatter get(Locale locale) {
        return dateTimeFormatterByLocale.get(locale);
    }

}

開発モードではすべて問題ありませんが、ネイティブ モードではロケールは無視されます。スタイルは常に同じで、月名は翻訳されません。Google で解決策を探していましたが、何も見つからなかったので、StackOverflow で質問しました。

必要に応じてご利用いただけます。

よろしく、ステファン。

4

1 に答える 1