【发布时间】: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.UK,LocalDateTime 值的德语格式也如下所示:
使用像 LocalDateTimeRenderer<T> 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