【问题标题】:Vaadin 21: change date format at LocalDateTimeRenderer in Grid on locale changeVaadin 21:在区域设置更改时更改网格中 LocalDateTimeRenderer 的日期格式
【发布时间】:2022-01-01 20:39:02
【问题描述】:

情况和问题,简短

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

情况和问题,详细/详细

在 Vaadin 21 Grid 我有一个 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()(参见此处Vaadin 21: re-translate column with ItemLabelGenerator on locale change)刷新整个Grid 会导致上面代码示例中的ValueProvider 再次被调用(我认为这是一个很好的指标),但它不会格式化@987654335 @ 在新选择的语言中(这是意外行为)。

因此,即使会话中的语言环境是英语/Locale.UKLocalDateTime 值的德语格式也如下所示:

使用像 LocalDateTimeRenderer&lt;T&gt; renderer = new LocalDateTimeRenderer(getter, DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.SHORT)); 这样的本地化 DateTimeFormatter 也无济于事:风格不同,但月份仍被翻译成德语。

解决方法

使用自定义 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;
}

问题

是否有一些技巧可以使用 Vaadins LocalDateTimeRenderer 获得相同的结果?

【问题讨论】:

    标签: vaadin vaadin-flow vaadin-grid vaadin21


    【解决方案1】:

    不,如果您在 Vaadin 21 或 Vaadin 22 中使用 LocalDateRendererLocalDateTimeRenderer,则无法动态更改列的区域设置。原因如下:

    1. 区域设置未明确保存在渲染器中。提供给渲染器构造函数(或默认值)的 Locale 用于生成 Formatter,将其保存到字段 private DateTimeFormatter formatter;
    2. formatter 没有任何 getter 或 setter。
    3. 即使 VaadinSession 的语言环境发生变化,formatter 的语言环境仍与其创建时使用的语言环境相同
    4. 在创建列后,您无法将其 Renderer 更改为其他内容。

    可以做的就是删除该列并使用具有请求区域设置的新LocalDate(Time)Renderer 重新添加它。

    我建议在 https://github.com/vaadin/flow-components/ 中创建一个关于此的功能请求

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 2020-11-22
      • 1970-01-01
      相关资源
      最近更新 更多