2

情况和问题,简短

LocalDateTimeRendererVaadin 21 中,即使 Vaadin 会话中的 Locale 更改为 eg ,也会在德语浏览器中显示德语日期Locale.UK

情况和问题,长/详细

在 Vaadin 21Grid中,我有一个 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;
}

Locale当我通过调用整个应用程序更改会话时,将UI.getCurrent().getSession().setLocale(locale);其翻译成新语言,而不是LocalDateTime-column 的内容。

Grid通过调用刷新整体grid.getDataProvider().refreshAll()(参见此处Vaadin 21: re-translate column with ItemLabelGenerator on locale change)导致ValueProvider上面代码示例LocalDateTime中的(这是意外行为)。

因此,即使会话中的语言环境是英语 / Locale.UK,该LocalDateTime值也采用德语格式,如下所示: 在此处输入图像描述

像这样使用本地化的 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;
}

问题

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

4

1 回答 1

3

LocalDateRenderer不,如果您正在使用或在 Vaadin 21 或 Vaadin 22 中,则无法动态更改列的语言环境LocalDateTimeRenderer。这是因为以下原因:

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

可以LocalDate(Time)Renderer做的是删除列并使用请求的语言环境重新添加它。

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

于 2021-12-03T13:14:04.323 回答