Локализация - это сочетание языковых и культурных аспектов.
Они включают в себя: язык сообщений, различные наборы символов,
лексикографические соглашения и т.д.
Программа должна определять локализацию и действовать согласно ее
установкам в целях достижения взаимосвязи различных культур.
Файл
<locale.h>
описывает типы данных, функции и макросы, необходимые для выполнения этой задачи.
В нем описаны функции:
setlocale(),
устанавливающая текущие региональные настройки, и
localeconv(),
которая возвращает информацию о форматировании чисел.
Существуют различные категории локализации, которые программа может
использовать; они описаны как макросы.
Используя их в качестве первого аргумента функции
setlocale(),
можно установить региональные настройки одной из следующих категорий:
LC_COLLATE
Эта категория изменяет поведение функций
strcoll()
и
strxfrm(),
которые используются для сравнения строк с учетом местного алфавита. Например,
немецкая sharp s рассматривается как "ss".
LC_CTYPE
Эта категория влияет на поведение функций обработки и классификации символов,
таких, как:
isupper()
и
toupper(),
а также многобайтных символьных функций, таких, как:
mblen()
или
wctomb().
LC_MONETARY
влияет на информацию, возвращаемую функцией
localeconv(),
которая описывает способ отображения числа: например, необходимо ли использовать
в качестве десятичного разделителя точку или запятую. Этой информацией пользуется
функция
strfmon().
LC_MESSAGES
изменяет язык отображаемых сообщений и указывает, как должны выглядеть
положительный и отрицательный ответы. Библиотека GNU C содержит функцию
rpmatch()
для более удобного применения этой информации.
LC_NUMERIC
изменяет информацию, которой пользуется семейство функций
printf()
и
scanf(),
если необходимо использовать региональные настройки.
Эта информация может быть также прочитана при помощи функции
localeconv().
LC_TIME
влияет на поведение функции
strftime(),
которая используется для отображения текущего времени в местном формате; например,
большая часть Европы использует 24-часовой формат, тогда как в США используют
12-часовой.
LC_ALL
Все вышеперечисленное.
Если второй аргумент функции
setlocale()---
пустая строка
,
то
локализация по умолчанию будет определяться следующим образом:
1.
Если существует непустая переменная окружения
LC_ALL,
то используется ее значение.
2.
Если существует переменная окружения с именем одной из вышеописанных категорий
локализации и она непустая, то ее значение присваивается этой категории.
3.
Если существует непустая переменная окружения
LANG,
то используется ее значение.
Информация о локальном форматировании чисел доступна в структуре
struct lconv,
возвращаемой функцией
localeconv(),
которая описана следующим образом:
struct lconv
{
/* Числовая (не связанная с деньгами) информация. */
char *decimal_point; /* Символ десятичного разделителя. */
char *thousands_sep; /* Разделитель тысяч. */
/* Каждый элемент является номером цифры в каждой группе;
большие элементы указывают на крайние слева значения.
Элемент с значением CHAR_MAX означает, что старших групп больше нет.
Элемент со значением 0 указывает, что предыдущий элемент используется
для всех групп, находящихся левее. */
char *grouping;
/* Денежная информация. */
/* Первые три символа являются символом валюты согласно ISO 4217.
Четвертый символ является разделителем. Пятый символ равен '\0'. */
char *int_curr_symbol;
char *currency_symbol; /* Местный символ валюты. */
char *mon_decimal_point; /* Символ десятичной точки. */
char *mon_thousands_sep; /* Разделитель тысяч. */
char *mon_grouping; /* См. выше описание элемента `grouping' */
char *positive_sign; /* Знак положительных значений. */
char *negative_sign; /* Знак отрицательных значений. */
char int_frac_digits; /* Представление дробных чисел в международном варианте. */
char frac_digits; /* Представление дробных чисел в локальном варианте. */
/* 1, если символ валюты предшествует положительному значению,
0, если следует за ним. */
char p_cs_precedes;
/* 1, если пробел отделяет символ валюты от положительного значения. */
char p_sep_by_space;
/* 1, если символ валюты предшествует отрицательному значению,
0, если следует за ним. */
char n_cs_precedes;
/* 1, если пробел отделяет символ валюты от отрицательного значения. */
char n_sep_by_space;
/* Позиция положительного или отрицательного знака:
0 Скобки окружают количество и символ валюты.
1 Знак предшествует количеству и символу валюты.
2 Знак следует за количеством и символом валюты.
3 Знак непосредственно предшествует символу валюты.
4 Знак непосредственно следует за символом валюты. */
char p_sign_posn;
char n_sign_posn;
};