Программирование для 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. Список констант приведен ниже.
Макрокоманда 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)) Первичный идентификатор задает национальный язык, а вторичный - его диалект или разновидность. Для первичного идентификатора вы можете указать одно из следующих значений:
Ниже мы привели список допустимых вторичных идентификаторов:
Заметим, что хотя приложение может указывать любые из перечисленных выше идентификаторов национальных языков, функция SetThreadLocale сможет установить только те, что были выбраны при установке операционной системы Microsoft Windows NT. И еще одно замечание. Если в качестве первичного идентификатора языка указать константу LANG_NEUTRAL, то комбинации с идентификаторами SUBLANG_NEUTRAL, SUBLANG_DEFAULT и 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. |