Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование для Windows NT

© Александр Фролов, Григорий Фролов
Том 27, часть 2, М.: Диалог-МИФИ, 1996, 272 стр.

[Назад] [Содеожание] [Дальше]

Наборы национальных параметров

При установке Microsoft Windows NT пользователь может указать, какие наборы национальных параметров должны быть установлены (для каких стран). Российские пользователи в своем большинстве пожелают установить по крайней мере английский и русский набор параметров, для того чтобы было можно работать в английской и русской среде. Некоторым дополнительно могут потребоваться национальные параметры для работы с французским, немецким или каким-либо другим языком.

С точки зрения разработчика приложений наборы параметров обозначаются при помощи так называемого идентификатора наборов национальных параметров LCID (в документации к SDK этот термин звучит как locale identifier).

Многозадачная операционная система Microsoft Windows NT допускает установку отдельного набора национальных параметров для каждой задачи. Для этого предназначена функция с именем SetThreadLocale. Что же касается Microsoft Windows 95, то в среде этой операционной системы соответствующих средств нет - пользователь должен выбрать только один набор при помощи приложения Control Panel (пиктограмма Regional Settings). Новый набор параметров будет использован после перезагрузки.

Рассмотрим кратко средства, предназначенные для работы с наборами национальных параметров.

Установка набора национальных параметров

Как мы только что сказали, в операционной системе Microsoft Windows NT для установки набора национальных параметров, используемых текущей задачей, эта задача должна вызвать функцию SetThreadLocale:


BOOL SetThreadLocale(
  LCID Locale); // идентификатор национального набора

Работа с функцией SetThreadLocale проста - вам достаточно передать ей нужный идентификатор в качестве параметра. При успехе функция возвратит значение TRUE, а при ошибке - FASLE. В последнем случае вы можете определить код ошибки с помощью функции GetLastError.

Как задавать идентификатор национального набора параметров?

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

 Константа

 Описание

 LOCALE_SYSTEM_DEFAULT

 Идентификатор, который используется операционной системой по умолчанию

 LOCALE_USER_DEFAULT

 Идентификатор, который используется по умолчанию для текущего пользователя, работающего в среде Microsoft Windows NT

Макрокоманда MAKELCID позволяет составить идентификатор национального набора параметров LCID из двух значений: идентификатора национального языка и идентификатора метода сортировки. Ниже мы привели прототип этой макрокоманды и ее определение:


DWORD MAKELCID(
  WORD  wLanguageID, // идентификатор национального языка
  WORD  wSortID);    // идентификатор метода сортировки

#define MAKELCID(lgid, srtid) \
  ((DWORD)((((DWORD)((WORD)(srtid))) << 16) \
  | ((DWORD)((WORD)(lgid)))))

Что касается идентификатора сортировки, то здесь вы должны указывать значение SORT_DEFAULT. А для создания идентификатора национального языка вам придется воспользоваться еще одной макрокомандой с именем MAKELANGID:


WORD MAKELANGID(
  USHORT usPrimaryLanguage, // первичный идентификатор языка
  USHORT usSubLanguage);    // вторичный идентификатор языка

#define MAKELANGID(usPrimaryLanguage, usSubLanguage) \
  ((((WORD)( usSubLanguage)) << 10) \
  | (WORD)( usPrimaryLanguage))

Первичный идентификатор задает национальный язык, а вторичный - его диалект или разновидность.

Для первичного идентификатора вы можете указать одно из следующих значений:

 Первичный идентификатор

 Национальный язык

 LANG_AFRIKAANS

 Африканский

 LANG_ALBANIAN

 Албанский

 LANG_ARABIC

 Арабский

 LANG_BASQUE

 Баский

 LANG_BULGARIAN

 Болгарский

 LANG_BYELORUSSIAN

 Белорусский

 LANG_CATALAN

 Каталанский

 LANG_CHINESE

 Китайский

 LANG_CROATIAN

 Хорватский

 LANG_CZECH

 Чехословацкий

 LANG_DANISH

 Датский

 LANG_DUTCH

 Нидерландский

 LANG_ENGLISH

 Английский

 LANG_ESTONIAN

 Эстонский

 LANG_FINNISH

 Финнский

 LANG_FRENCH

 Французский

 LANG_GERMAN

 Немецкий

 LANG_GREEK

 Греческий

 LANG_HEBREW

 Еврейский

 LANG_HUNGARIAN

 Венгерский

 LANG_ICELANDIC

 Исландский

 LANG_INDONESIAN

 Индонезийский

 LANG_ITALIAN

 Итальянский

 LANG_JAPANESE

 Японский

 LANG_KOREAN

 Корейский

 LANG_LATVIAN

 Латвийский

 LANG_LITHUANIAN

 Литовский

 LANG_NEUTRAL

 Нейтральный

 LANG_NORWEGIAN

 Норвежский

 LANG_POLISH

 Польский

 LANG_PORTUGUESE

 Португальский

 LANG_ROMANIAN

 Румынский

 LANG_RUSSIAN

 Русский

 LANG_SLOVAK

 Словацкий

 LANG_SLOVENIAN

 Словенский

 LANG_SORBIAN

 Сербский

 LANG_SPANISH

 Испанский

 LANG_SWEDISH

 Шведский

 LANG_THAI

 Таиландский

 LANG_TURKISH

 Турецкий

 LANG_UKRANIAN

 Украинский

Ниже мы привели список допустимых вторичных идентификаторов:

 Вторичный идентификатор

 Диалект

 SUBLANG_CHINESE_HONGKONG

 Гонконгский диалект китайского

 SUBLANG_CHINESE_SIMPLIFIED

 Упрощенный диалект китайского

 SUBLANG_CHINESE_SINGAPORE

 Сингапурский диалект китайского

 SUBLANG_CHINESE_TRADITIONAL

 Традиционный китайский

 SUBLANG_DEFAULT

 Диалект, который используется по умолчанию

 SUBLANG_DUTCH

 Нидерландский

 SUBLANG_DUTCH_BELGIAN

 Бельгийский диалект нидерландского

 SUBLANG_ENGLISH_AUS

 Австрийский диалект английского

 SUBLANG_ENGLISH_CAN

 Канадский диалект английского

 SUBLANG_ENGLISH_EIRE

 Ирландский диалект английского

 SUBLANG_ENGLISH_NZ

 Новозеландский диалект английского

 SUBLANG_ENGLISH_UK

 Британский диалект английского

 SUBLANG_ENGLISH_US

 Американский диалект английского

 SUBLANG_FRENCH

 Французский

 SUBLANG_FRENCH_BELGIAN

 Бельгийский диалект французского

 SUBLANG_FRENCH_CANADIAN

 Канадский диалект французского

 SUBLANG_FRENCH_SWISS

 Шведский диалект французского

 SUBLANG_GERMAN

 Немецкий

 SUBLANG_GERMAN_AUSTRIAN

 Австрийский диалект немецкого

 SUBLANG_GERMAN_SWISS

 Швейцарский диалект немецкого

 SUBLANG_ITALIAN

 Итальянский

 SUBLANG_ITALIAN_SWISS

 Швейцарский диалект итальянского

 SUBLANG_NEUTRAL

 Нейтральный

 SUBLANG_PORTUGUESE

 Португальский

 SUBLANG_PORTUGUESE_BRAZILIAN

 Бразильский диалект португальского

 SUBLANG_SPANISH

 Испанский

 SUBLANG_SPANISH_MEXICAN

 Мексиканский диалект испанского

 SUBLANG_SPANISH_MODERN

 Современный испанский

 SUBLANG_SYS_DEFAULT

 Диалект, который используется операционной системой по умолчанию

Заметим, что хотя приложение может указывать любые из перечисленных выше идентификаторов национальных языков, функция SetThreadLocale сможет установить только те, что были выбраны при установке операционной системы Microsoft Windows NT.

И еще одно замечание.

Если в качестве первичного идентификатора языка указать константу LANG_NEUTRAL, то комбинации с идентификаторами SUBLANG_NEUTRAL, SUBLANG_DEFAULT и SUBLANG_SYS_DEFAULT будут иметь специальное значение, как это показано ниже:

 Вторичный идентификатор в комбинации с LANG_NEUTRAL

 Национальный язык

 SUBLANG_NEUTRAL

 Нейтральный язык

 SUBLANG_DEFAULT

 Язык, который установлен по умолчанию для текущего пользователя, работающего с Microsoft Windows NT

 SUBLANG_SYS_DEFAULT

 Язык, который используется операционной системой по умолчанию

Ниже мы привели пример использования функции SetThreadLocale для установки английского и русского наборов национальных параметров:


// Установка английского набора параметров
fRc = SetThreadLocale(MAKELCID(
  MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), SORT_DEFAULT));

// Установка русского набора параметров
fRc = SetThreadLocale(MAKELCID(
  MAKELANGID(LANG_RUSSIAN, SUBLANG_NEUTRAL), SORT_DEFAULT));

Определение национального набора параметров

Помимо установки нового набора национальных параметров, часто возникает и обратная задача - определение текущего набора национальных параметров, или определение набора, который используется по умолчанию операционной системой или текущим пользователем. Для решения этой задачи в программном интерфейсе операционной системы Microsoft Windows NT предусмотрен набор функций и макрокоманд, к рассмотрению которых мы сейчас переходим.

Определение текущего набора национальных параметров для задачи

В любой момент времени задача может получить установленный для нее идентификатор текущего набора установленных параметров, если воспользуется функцией GetThreadLocals:


LCID GetThreadLocale(VOID);

Эта функция не имеет параметров. Она возвращает 32-разрядный идентификатор национального набора параметров, из которого при помощи различных макрокоманд можно выделить различные компоненты.

С помощью макрокоманды LANGIDFROMLCID вы можете выделить из идентификатора набора национальных параметров идентификатор национального языка:


WORD LANGIDFROMLCID(
  LCID lcid); // идентификатор набора национальных параметров
#define LANGIDFROMLCID(lcid) ((WORD)(lcid))

Далее, с помощью макрокоманды PRIMARYLANGID нетрудно выделить из идентификатора национального языка первичный идентификатор языка:


WORD PRIMARYLANGID(
  WORD  lgid); // идентификатор национального языка
#define PRIMARYLANGID(lgid) ((WORD)(lgid) & 0x3ff)

Аналогично, макрокоманда SUBLANGID XE "SUBLANGID" позволяет выделить из идентификатора национального языка вторичный идентификатор языка (диалект):


WORD SUBLANGID(
  WORD  lgid); // идентификатор национального языка
#define SUBLANGID(lgid) ((WORD)(lgid) >> 10)

Определение набора национальных параметров по умолчанию

Если приложению нужно использовать наборы национальных параметров, которые используются операционной системой по умолчанию или которые установлены для текущего пользователя по умолчанию, оно также может использовать специальные функции.

Функция GetSystemDefaultLCID не имеет параметров и возвращает идентификатор набора национальных параметров, которые используются операционной системой по умолчанию:


LCID GetSystemDefaultLCID(VOID);

Для определения идентификатора набора национальных параметров, установленных по умолчанию для текущего пользователя Microsoft Windows NT вы должны вызвать функцию GetUserDefaultLCID, которая также не имеет параметров:


LCID GetUserDefaultLCID(VOID);

Функция GetSystemDefaultLangID позволяет определить идентификатор национального языка, который используется операционной системой по умолчанию:


LANGID GetSystemDefaultLangID(VOID);

С помощью функции GetUserDefaultLangID приложение может определить идентификатор национального языка, который установлен по умолчанию для текущего пользователя Microsoft Windows NT:


LANGID GetUserDefaultLangID(VOID);

Определение отдельных национальных параметров

Теперь, когда мы научились устанавливать и определять идентификатор национальных параметров, пора перейти к самим национальным параметрам.

Для определения значений отдельных параметров для заданного идентификатора национальных параметров вы должны использовать функцию GetLocaleInfo:


int GetLocaleInfo(
  LCID   Locale,   // идентификатор набора параметров 
  LCTYPE LCType,   // тип информации 
  LPTSTR lpLCData, // адрес буфера для информации 
  int    cchData); // размер буфера для информации 

Параметр Locale этой функции задает идентификатор национальных параметров, для которого нужно определить один из конкретных параметров.

Нужный национальный параметр задается параметром LCType функции GetLocaleInfo. Немного позже мы приведем сокращенный список допустимых значений для этого параметра.

Полученная информация будет записана в буфер, адрес которого задается параметром lpLCData, а размер - параметром cchData. Информация будет записана в буфер в виде текстовой строки.

Обычно буфер заказывается динамически, причем для определения требуемого размера буфера достаточно указать значение параметра lpLCData, равное NULL, - в этом случае функция GetLocaleInfo вернет нужный размер буфера в байтах.

В случае успешного выполнения функция GetLocaleInfo возвращает размер текстовой строки с информацией, записанной в буфер lpLCData. При ошибке возвращается нулевое значение.

Для типа информации LCType можно задавать очень много значений. Все допустимые значения описаны в документации SDK. Из-за ограниченного объема книги мы не имеем возможности все их перечислить, поэтому ограничимся только самыми интересными:

·       LOCALE_ILANGUAGE

Идентификатор национального языка (длиной не более 5 символов)

·       LOCALE_SLANGUAGE

Полное название национального языка

·       LOCALE_SENGLANGUAGE

Полное английское название языка

·       LOCALE_SABBREVLANGNAME

Сокращенное трехсимвольное название языка

·       LOCALE_SNATIVELANGNAME

Естественное названия языка

·       LOCALE_ICOUNTRY

Код страны (длиной не более 6 символов)

·       LOCALE_SCOUNTRY

Полное локализованное название страны

·       LOCALE_SENGCOUNTRY

Полное английское название страны

·       LOCALE_SABBREVCTRYNAME

Сокращенное название страны

·       LOCALE_SNATIVECTRYNAME

Естественное название страны

·       LOCALE_IDEFAULTLANGUAGE

Идентификатор основного языка, который используется в данной стране

·       LOCALE_IDEFAULTCOUNTRY

Основной код страны

·       LOCALE_IDEFAULTCODEPAGE

Номер кодовой страницы OEM

·       LOCALE_IDEFAULTANSICODEPAGE

Номер кодовой страницы ANSI

·       LOCALE_SLIST

Символ, который используется для разделения элементов списка

·       LOCALE_IMEASURE

Система измерений (0 - метрическая, 1 - американская)

·       LOCALE_SDECIMAL

Символ, который используется в качестве десятичного разделителя в числах

·       LOCALE_STHOUSAND

Символ, который используется в качестве разделителя групп цифр в многозначных числах

·       LOCALE_SDATE

Символ-разделитель в строке даты

·       LOCALE_STIME

Символ-разделитель в строке времени

·       LOCALE_IDATE

Порядок, в котором располагаются компоненты даты:

0: Месяц-День-Год,

1: День-Месяц-Год,

2: Год-Месяц-День

·       LOCALE_SDAYNAME1

Естественное длинное название для понедельника

·       LOCALE_SDAYNAME2 - LOCALE_SDAYNAME7

Естественное длинное название для дней недели от вторника до воскресения

·       LOCALE_SABBREVDAYNAME1

Естественное сокращенное название для понедельника

·       LOCALE_SABBREVDAYNAME2 - LOCALE_SABBREVDAYNAME7

Естественное сокращенное название для дней недели от вторника до воскресения

·       LOCALE_SMONTHNAME1

Естественное длинное название для января

·       LOCALE_SMONTHNAME2 - LOCALE_SMONTHNAME12

Естественное длинное название для месяцев от февраля до декабря

Помимо перечисленных, предусмотрены многочисленные константы для определения формата отображения даты, времени и денежных единиц, положительных и отрицательных чисел и так далее.

В качестве примера использования функции GetLocaleInfo приведем следующий фрагмент кода, в котором мы определяем полное название национального языка для текущей задачи:


GetLocaleInfo(
  GetThreadLocale(), LOCALE_SLANGUAGE, szBuf, 512);

Здесь полученное название языка будет записано в виде текстовой строки в буфер szBuf.

[Назад] [Содеожание] [Дальше]