Vaadin 21:区域设置更改时在网格中的LocalDateTimeRenender处更改日期格式 [英] Vaadin 21: change date format at LocalDateTimeRenderer in Grid on locale change
问题描述
情况和问题,简短
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.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;
}
问题
是否有什么技巧可以使VaadinsLocalDateTimeRenderer
获得相同的结果?
推荐答案
否,如果您在Vaadin21或Vaadin22中使用LocalDateRenderer
或LocalDateTimeRenderer
,则无法动态更改列的区域设置。这是因为以下原因:
- 区域设置未显式保存在呈现器中。提供给呈现器构造函数(或默认值)的区域设置用于生成格式化程序,该格式化程序将保存到字段
private DateTimeFormatter formatter;
formatter
没有任何getter或setter。- 即使
VaadinSession
的区域设置更改,formatter
的区域设置仍与使用 创建的区域设置相同
- 创建列后不能将其
Renderer
更改为其他值。
您可以做的是删除该列,然后使用请求的区域设置重新添加一个新的LocalDate(Time)Renderer
。
我建议在https://github.com/vaadin/flow-components/中创建有关此问题的功能请求
这篇关于Vaadin 21:区域设置更改时在网格中的LocalDateTimeRenender处更改日期格式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!