Although this questions is old, and I agree that translation should occur automatically, sometimes it simply does not work. My workaround is to define a TStringField descendant, in a package:
unit MyField;
.
.
.
Type
TMyStringField = class(TStringField)
protected
procedure SetAsString(const Value: string); override;
Function GetAsString : String; Override;
end;
function TMyStringField.GetAsString: String;
begin
Result := inherited Utf8ToAnsi (GetAsString)
end;
procedure TMyStringField.SetAsString(const Value: string);
begin
inherited SetAsString(AnsiToUtf8(Value))
end;
Don't forget to register this field:
Procedure Register;
begin
RegisterFields([TMyStringField]);
end;
From help:
Call RegisterFields to allow custom descendants of TField to appear in
the field type drop down of the new field dialog box.
The FieldClasses parameter is an array of TField descendants.In C++,
the FieldClasses_Size is the index of the last class in the array (one
less than the number of class types).
This approach has the disadvantage that you must add the fields by hand, or replace TStringField to TMyStringField