Как получить локализованные названия дней в Delphi? - PullRequest
8 голосов
/ 15 января 2009

Я использую стандартные константы Delphi DayMonday и т. Д. И хочу преобразовать их в локализованные строки (например, "Lundi"). Для этого есть простой вызов RTL или VCL?

Ответы [ 2 ]

7 голосов
/ 15 января 2009

Вы можете получить различные настройки локали:

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

GetThreadLocale дает текущий LCID, но вы можете использовать другой номер самостоятельно.

TFormatSettings запись:

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;

См. Также http://www.microsoft.com/globaldev/reference/lcid-all.mspx для получения полного списка.

Вы даже можете изменить форматирование самостоятельно, чтобы получить действительно фантастические результаты.

3 голосов
/ 15 января 2009

Я думал Я нашел простой способ для "текущей локали".

В system.pas

определены глобальные массивы LongDayNames [] и ShortDayNames [].

Так ..

  Label.Text = LongDayName[DayMonday];

должно работать, например. За исключением того, что возвращается "воскресенье" . Это связано с тем, что Delphi внутренне поддерживает двухдневные схемы нумерации, а DayMonday является константой ISO8601, равной 1, а массив LongDayName ожидает воскресенье в качестве первого дня недели. C ++ Builder еще больше сбивает с толку, потому что массив строк начинается с нуля, а не с единицы.

...