情况和问题,简短
在LocalDateTimeRenderer
Vaadin 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
?