FMX框架下Tlang组件无法翻译FireDAC读取的网格数据库数据求助
解决FMX中Tlang无法翻译FireDAC网格数据库数据的问题
Tlang组件默认只处理设计时绑定到控件的静态文本,从数据库动态加载的网格数据不会自动触发翻译,你可以通过以下几种方式实现目标列的翻译:
方法1:加载数据后手动翻译数据集字段
当FireDAC数据集(如TFDQuery)加载完成后,遍历数据并替换目标列的原始值为翻译后内容:
FDQuery.First; while not FDQuery.Eof do begin // 假设状态列名为Status var OriginalStatus := FDQuery.FieldByName('Status').AsString; var TranslatedStatus := Lang.Translate(OriginalStatus); FDQuery.Edit; FDQuery.FieldByName('Status').AsString := TranslatedStatus; FDQuery.Post; FDQuery.Next; end;
注意:此方法会修改数据集内的原始值,若需保留原始数据,优先选择下面的计算字段或网格事件方式。
方法2:用计算字段动态翻译
通过添加计算字段,在数据加载或语言切换时自动生成翻译内容,不修改原始数据:
- 打开数据集的字段编辑器,添加一个计算字段(命名如
TranslatedStatus),字段类型设为String。 - 在数据集的
OnCalcFields事件中编写翻译逻辑:
procedure TForm1.FDQueryCalcFields(DataSet: TDataSet); begin var OriginalStatus := DataSet.FieldByName('Status').AsString; DataSet.FieldByName('TranslatedStatus').AsString := Lang.Translate(OriginalStatus); end;
- 将网格的目标列绑定到这个计算字段即可。
方法3:通过网格列的OnGetDisplayText事件翻译显示内容
直接在网格显示层面处理翻译,完全不修改数据集:
- 选中网格的状态列,绑定其
OnGetDisplayText事件。 - 在事件中编写翻译代码:
procedure TForm1.GridColumnStatusGetDisplayText(Sender: TObject; const Value: TValue; var Text: string); begin Text := Lang.Translate(Value.ToString); end;
语言切换时的刷新处理
当调用Lang.ActiveLanguage切换语言后,需要触发翻译逻辑的重新执行:
procedure TForm1.SwitchToFrenchBtnClick(Sender: TObject); begin Lang.ActiveLanguage := 'fr'; // 刷新数据集触发计算字段更新,或直接刷新网格 FDQuery.Refresh; Grid.Repaint; end;
关键注意事项
- 确保Tlang的语言资源文件中已配置对应翻译条目:
good→bien、damaged→endommagé、out of stock→rupture de stock(修正了原表述中的法语拼写错误)。 - 若使用计算字段或网格事件方式,无需修改数据库原始数据,更适合多语言切换场景。
内容的提问来源于stack exchange,提问作者Zakaria Mimeche
相关产品推荐
相关产品推荐

