How to get localised day names in Delphi?

You can get different locale settings by:

var
  fs : TFormatSettings;
  x  : string;
begin
  GetLocaleFormatSettings(GetThreadlocale, fs);
  x:= FormatDateTime('%mmmm', Now, fs);
  // etc..
end;

GetThreadLocale gives the current LCID but you can use another number yourself.

TFormatSettings record:

TFormatSettings = record
  CurrencyFormat: Byte;
  NegCurrFormat: Byte;
  ThousandSeparator: Char;
  DecimalSeparator: Char;
  CurrencyDecimals: Byte;
  DateSeparator: Char;
  TimeSeparator: Char;
  ListSeparator: Char;
  CurrencyString: string;
  ShortDateFormat: string;
  LongDateFormat: string;
  TimeAMString: string;
  TimePMString: string;
  ShortTimeFormat: string;
  LongTimeFormat: string;
  ShortMonthNames: array[1..12] of string;
  LongMonthNames: array[1..12] of string;
  ShortDayNames: array[1..7] of string;
  LongDayNames: array[1..7] of string;
  TwoDigitYearCenturyWindow: Word;
end;

See also http://www.microsoft.com/globaldev/reference/lcid-all.mspx for a complete list.

You can even change the formatsettings yourself to create really fancy results.


I thought I had found a simple way for the "current locale".

There are global arrays LongDayNames[] and ShortDayNames[] defined in system.pas

So..

  Label.Text = LongDayName[DayMonday];

should work, for example. Except it returns "Sunday". This is because Delphi internally supports two day numbering schemes, and DayMonday is an the ISO8601 constant 1, while the LongDayName array expects sunday as the first day of the week. C++Builder confuses things further because the string array then starts at zero, not one.