Table of Contents

Localization

Translate every UI string the grid surfaces — filter dropdowns, filter row prompts, sort buttons, clear buttons — without patching resource strings or rebuilding the package.

Overview

Grid.Options.Localization exposes a property for every user-visible string the grid produces. The defaults are English. Override individual properties to translate them. Each property has a stored function that only writes it to the form file when it differs from the English default, so the DFM stays small.

Quick example

// French
Grid.Options.Localization.FilterAllText                   := '(Tous)';
Grid.Options.Localization.FilterEmptyText                 := '(Vide)';
Grid.Options.Localization.FilterNotEmptyText              := '(Non vide)';
Grid.Options.Localization.FilterEditPrompt                := 'Filtrer';
Grid.Options.Localization.FilterClearButtonHint           := 'Effacer le filtre';
Grid.Options.Localization.FilterTypeButtonHint            := 'Type de filtre';
Grid.Options.Localization.FilterTypeContainsText          := 'Contient';
Grid.Options.Localization.FilterTypeEndsWithText          := 'Se termine par';
Grid.Options.Localization.FilterTypeEqualText             := 'Égal à';
Grid.Options.Localization.FilterTypeNotEqualText          := 'Différent de';
Grid.Options.Localization.FilterTypeStartsWithText        := 'Commence par';
Grid.Options.Localization.FilterTypeLargerThanText        := 'Supérieur à';
Grid.Options.Localization.FilterTypeLargerOrEqualThanText := 'Supérieur ou égal à';
Grid.Options.Localization.FilterTypeSmallerThanText       := 'Inférieur à';
Grid.Options.Localization.FilterTypeSmallerOrEqualThanText:= 'Inférieur ou égal à';
Grid.Options.Localization.FilterSortButtonAscendingText   := 'Trier croissant';
Grid.Options.Localization.FilterSortButtonDescendingText  := 'Trier décroissant';

Localizable strings

Filter dropdown / popup

Property Default
FilterAllText (All)
FilterEmptyText (Empty)
FilterNotEmptyText (Not empty)
Grid.Options.Localization.FilterAllText      := '(All)';
Grid.Options.Localization.FilterEmptyText    := '(Empty)';
Grid.Options.Localization.FilterNotEmptyText := '(Not empty)';

Filter row

Property Default
FilterEditPrompt Filter
FilterClearButtonHint Clear filter
FilterTypeButtonHint Filter type
Grid.Options.Localization.FilterEditPrompt      := 'Filter';
Grid.Options.Localization.FilterClearButtonHint := 'Clear filter';
Grid.Options.Localization.FilterTypeButtonHint  := 'Filter type';

Filter operator labels

Property Default
FilterTypeContainsText Contains
FilterTypeEndsWithText Ends with
FilterTypeStartsWithText Starts with
FilterTypeEqualText Equal
FilterTypeNotEqualText Not equal
FilterTypeLargerThanText Larger than
FilterTypeLargerOrEqualThanText Larger or equal than
FilterTypeSmallerThanText Smaller than
FilterTypeSmallerOrEqualThanText Smaller or equal than
Grid.Options.Localization.FilterTypeContainsText           := 'Contains';
Grid.Options.Localization.FilterTypeEndsWithText           := 'Ends with';
Grid.Options.Localization.FilterTypeStartsWithText         := 'Starts with';
Grid.Options.Localization.FilterTypeEqualText              := 'Equal';
Grid.Options.Localization.FilterTypeNotEqualText           := 'Not equal';
Grid.Options.Localization.FilterTypeLargerThanText         := 'Larger than';
Grid.Options.Localization.FilterTypeLargerOrEqualThanText  := 'Larger or equal than';
Grid.Options.Localization.FilterTypeSmallerThanText        := 'Smaller than';
Grid.Options.Localization.FilterTypeSmallerOrEqualThanText := 'Smaller or equal than';

Filter sort buttons

Property Default
FilterSortButtonAscendingText Sort ascending
FilterSortButtonDescendingText Sort descending
Grid.Options.Localization.FilterSortButtonAscendingText  := 'Sort ascending';
Grid.Options.Localization.FilterSortButtonDescendingText := 'Sort descending';

Wiring it to your i18n system

The whole Localization object is a regular TPersistent. You can copy it from a translated template at runtime:

procedure ApplyTranslation(Grid: TTMSFNCDataGrid; const LangCode: string);
begin
  case LangCode of
    'fr': Grid.Options.Localization.Assign(FrenchLocalization);
    'de': Grid.Options.Localization.Assign(GermanLocalization);
    'nl': Grid.Options.Localization.Assign(DutchLocalization);
  end;
end;

Where FrenchLocalization is a pre-populated TTMSFNCDataGridLocalizationOptions instance you build once at startup.

Find / replace dialogs

The find and replace dialogs are TMS FNC components (TTMSFNCFindDialog, TTMSFNCReplaceDialog) with their own localization. To translate their labels, update the dialog instance directly — typically inside OnBeforeShowFindDialog:

procedure TForm1.GridBeforeShowFindDialog(Sender: TObject;
  AFindDialog: TTMSFNCFindDialog; var ACanShow: Boolean);
begin
  AFindDialog.UILanguage.Caption  := 'Rechercher';
  AFindDialog.UILanguage.Find     := 'Suivant';
  AFindDialog.UILanguage.Close    := 'Fermer';
  AFindDialog.UILanguage.FindWhat := 'Rechercher :';
end;

Columns editor dialog

The columns editor dialog (TTMSFNCDataGridColumnsEditor) has its own Options.UILanguage for translating Visible/Apply/OK/Cancel etc.

Combining localization with i18n infrastructure

Apply all string groups at once from a pre-built object, then reload when the user switches language:

procedure TForm1.ApplyLocale(const LangCode: string);
var
  L: TTMSFNCDataGridLocalizationOptions;
begin
  L := TTMSFNCDataGridLocalizationOptions.Create;
  try
    case LangCode of
      'fr':
      begin
        // Filter dropdown
        L.FilterAllText       := '(Tous)';
        L.FilterEmptyText     := '(Vide)';
        L.FilterNotEmptyText  := '(Non vide)';
        // Filter row
        L.FilterEditPrompt    := 'Filtrer';
        L.FilterClearButtonHint := 'Effacer';
        // Operators
        L.FilterTypeContainsText  := 'Contient';
        L.FilterTypeEqualText     := 'Égal à';
        L.FilterTypeNotEqualText  := 'Différent de';
        // Sort buttons
        L.FilterSortButtonAscendingText  := 'Trier croissant';
        L.FilterSortButtonDescendingText := 'Trier décroissant';
      end;
    end;
    Grid.Options.Localization.Assign(L);
  finally
    L.Free;
  end;
end;

Call ApplyLocale on form create and whenever the user picks a new language. Because Localization is a TPersistent, Assign copies all 20+ properties in one call.

  • Grid.Options.Localization.* — every filter UI string
  • TTMSFNCDataGridColumnsEditor.Options.UILanguage — columns editor
  • TTMSFNCFindDialog.UILanguage — find dialog (set inside OnBeforeShowFindDialog)
  • TTMSFNCReplaceDialog.UILanguage — replace dialog

See also

  • Filtering — most localizable strings live here.
  • Filter row — the filter row uses the FilterEditPrompt, sort buttons, etc.
  • Find & replace — separate localization on the dialog instance.