Vaadin 21:区域设置更改时在网格中的LocalDateTimeRenender处更改日期格式 [英] Vaadin 21: change date format at LocalDateTimeRenderer in Grid on locale change

查看:20
本文介绍了Vaadin 21:区域设置更改时在网格中的LocalDateTimeRenender处更改日期格式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

情况和问题,简短

Vaadin 21中的LocalDateTimeRenderer在德语浏览器中显示德国日期,即使Vaadin会话中的区域设置更改为例如Locale.UK

情况和问题,详细/详细

在Vaadin21Grid中,我有一个LocalDateTime列。它是这样为实体类型T创建的:

private <T> Column<T> addLocalDateTimeColumn(Grid<T> grid, ValueProvider<T, LocalDateTime> getter) {
    LocalDateTimeRenderer<T> renderer = new LocalDateTimeRenderer(getter);
    Column<T> column = grid.addColumn(renderer).setAutoWidth(true);
    return column;
}

当我通过调用UI.getCurrent().getSession().setLocale(locale);更改会话中的Locale时,整个应用程序都会翻译成新语言,但不会翻译成LocalDateTime列的内容。

通过调用grid.getDataProvider().refreshAll()刷新整个Grid(请参见此处的Vaadin 21: re-translate column with ItemLabelGenerator on locale change)会导致再次调用上面代码示例中的ValueProvider(我认为这是一个很好的指示器),但它不会用新选择的语言格式化LocalDateTime(这是意外行为)。

因此,即使会话中的区域设置为英语/Locale.UKLocalDateTime值的德语格式如下:

使用这样的本地化DateTimeForMatterLocalDateTimeRenderer<T> renderer = new LocalDateTimeRenderer(getter, DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.SHORT));也无济于事:样式不同,但月份仍翻译为德语。

解决办法

使用自定义TextRenderer作品(=列LocalDateTime内容根据会话的区域设置翻译):

private <T> Column<T> addLocalDateTimeColumn(Grid<T> grid, ValueProvider<T, LocalDateTime> getter) {
    Renderer<T> renderer = new TextRenderer<T>(new ItemLabelGenerator<T>() {

        @Override
        public String apply(T entity) {
            final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd. MMMM yyyy HH:mm", UI.getCurrent().getLocale());
            return getter.apply(entity).format(formatter);
        }
    });
    Column<T> column = grid.addColumn(renderer).setAutoWidth(true);
    return column;
}

问题

是否有什么技巧可以使VaadinsLocalDateTimeRenderer获得相同的结果?

推荐答案

否,如果您在Vaadin21或Vaadin22中使用LocalDateRendererLocalDateTimeRenderer,则无法动态更改列的区域设置。这是因为以下原因:

  1. 区域设置未显式保存在呈现器中。提供给呈现器构造函数(或默认值)的区域设置用于生成格式化程序,该格式化程序将保存到字段private DateTimeFormatter formatter;
  2. formatter没有任何getter或setter。
  3. 即使VaadinSession的区域设置更改,formatter的区域设置仍与使用
  4. 创建的区域设置相同
  5. 创建列后不能将其Renderer更改为其他值。

可以做的是删除该列,然后使用请求的区域设置重新添加一个新的LocalDate(Time)Renderer

我建议在https://github.com/vaadin/flow-components/中创建有关此问题的功能请求

这篇关于Vaadin 21:区域设置更改时在网格中的LocalDateTimeRenender处更改日期格式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆