You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vaadin 21切换Locale时如何重新翻译Grid列经ItemLabelGenerator生成的内容

Vaadin 21 Grid列国际化切换后刷新方案

你可以根据业务场景选择以下两种实现方案:

方案一:全量刷新Grid(最简单通用,适合数据量不大的场景)

你定义的列渲染逻辑本身已经是动态调用getTranslation()获取当前区域的翻译值,只需要触发Grid重新渲染所有已加载的行即可完成翻译刷新,直接调用Grid的refreshAll()方法:

@Override
public void localeChange(LocaleChangeEvent localeChangeEvent) {
    // 原有其他组件刷新逻辑保持不变
    myTextfield.setLabel(getTranslation(textfieldI18nKey));
    myCombobox.setLabel(getTranslation(comboboxI18nKey));
    myCombobox.setItemLabelGenerator(myCombobox.getItemLabelGenerator());
    // 新增Grid刷新逻辑
    grid.refreshAll();
}

该方法是Vaadin官方提供的标准Grid内容刷新方式,会触发所有可见行的单元格重新渲染,自动读取最新的翻译值。

方案二:单列单独刷新(适合数据量大、不想刷新整个Grid的场景)

你可以参考ComboBox的刷新逻辑,重新设置目标列的渲染器,只触发该列的重绘:

  1. 首先将列的标签生成逻辑抽为成员变量,避免重复写逻辑:
// 定义为视图类的成员变量
private final ItemLabelGenerator<MyDomainClass> myEnumColumnGenerator = gridItem -> {
    String i18nKey = gridItem.getMyEnumAttribute().name();
    return getTranslation(i18nKey);
};
  1. 初始化列时直接使用该生成器:
Column<MyDomainClass> myColumn = grid.addColumn(new TextRenderer<>(myEnumColumnGenerator));
  1. 在区域切换逻辑中重新给列设置渲染器:
@Override
public void localeChange(LocaleChangeEvent localeChangeEvent) {
    // 原有其他组件刷新逻辑保持不变
    myTextfield.setLabel(getTranslation(textfieldI18nKey));
    myCombobox.setLabel(getTranslation(comboboxI18nKey));
    myCombobox.setItemLabelGenerator(myCombobox.getItemLabelGenerator());
    // 重新设置列渲染器触发单列刷新
    myColumn.setRenderer(new TextRenderer<>(myEnumColumnGenerator));
}

这种方式只会刷新指定列的内容,不会触发其他列的重绘,性能开销更低。

内容的提问来源于stack exchange,提问作者sdo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 09:15:03