views:

842

answers:

3

I'm using standard Delphi constants DayMonday, etc and I want to convert them to localized strings (eg "Lundi"). Is there a simple RTL or VCL call for this?

+5  A: 

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.

Gamecat
A: 

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.

Roddy
Yes, they are initialized using GetFormatSettings ;-). There are always different roads to the goal, but in this case they have the same source.
Gamecat
A: 

Hi Gamecat,

your statement of the arrays being initialized using GetFormatSettings I can't approve. Because nowhere in the code we have a method telling him to use the TFormatSettings variable.

Can you give me a hint how to get the array ShortMonthNames changed let's say to en-GB month names in Germany?