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

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:用计算字段动态翻译

通过添加计算字段,在数据加载或语言切换时自动生成翻译内容,不修改原始数据:

  1. 打开数据集的字段编辑器,添加一个计算字段(命名如TranslatedStatus),字段类型设为String。
  2. 在数据集的OnCalcFields事件中编写翻译逻辑:
procedure TForm1.FDQueryCalcFields(DataSet: TDataSet);
begin
  var OriginalStatus := DataSet.FieldByName('Status').AsString;
  DataSet.FieldByName('TranslatedStatus').AsString := Lang.Translate(OriginalStatus);
end;
  1. 将网格的目标列绑定到这个计算字段即可。

方法3:通过网格列的OnGetDisplayText事件翻译显示内容

直接在网格显示层面处理翻译,完全不修改数据集:

  1. 选中网格的状态列,绑定其OnGetDisplayText事件。
  2. 在事件中编写翻译代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:43:33