Установка локали в Linux
Подготовка локали к работе
Поддержка локали в РНР
Предикаты, основанные на локали
Функции библиотеки GNU Recode
Нечаянная радость: convert_cyr_string
Поддержка NLS
Поддержка локали в РНР реализована в виде двух групп функций. Первая группа,
которую мы рассмотрим в данном разделе, является «глобальной». Входящие в нее
функции setlocale и localeconv работают с РНР-окружением как таковым и оказывают влияние на всю последующую за ними интерпретацию локали. Вторая группа
представляет собой набор функций, которые попросту анализируют содержание
переданных аргументов и возвращают true или f al se в зависимости от выполнения
некоторых условий. Эту группу мы назовем «предикатами» по аналогии с Лиспом.
11.3.1. Считывание текущих настроек: localeconv
array localeconv ()
Функция возвращает ассоциативный массив, в котором содержатся действующие
на текущий момент соглашения об отображении числовых и денежных величин.
Функция учитывает действующие в данный момент настройки локали, произведенные с помощью функции setlocale() (см. раздел 11.3.2). Возвращаемый функцией ассоциативный массив содержит следующие элементы:
Элемент массива | Описание
| decimal_point | Разделитель десятичной точки
| thousands_sep | Разделитель тысячных разрядов
| groupi ng | Массив, содержащий группировку цифр
| int_curr_symbol | Международное обозначение валюты (например, USD)
| currency_symbol | Местное обозначение валюты (например, $)
| mon_decimal_point | Десятичная запятая в обозначении денежных единиц
| mon_thousands_sep | Разделитель тысячных разрядов при выводе денежных единиц
| mon_groupi ng | Массив, содержащий группировку цифр при выводе денежных единиц
| posi tive_sign | Знак, выводимый при печати положительных значений
| negative_sign | Знак, выводимый при печати отрицательных значений
| int_f rac_di gits | Международное представление дробных значений
| frac_digits | Локальное представление дробных значений
| p_cs_precedes | True, если currency_symbol выводится перед положительной величиной, и false, если символ валюты выводится после числа
| p_sep_by_space | True, если символ валюты отделяется от положительного числа пробелом, и false — в противном случае
| n_cs_precedes | True, если символ валюты выводится перед отрицательным значением, и false, если выводится после него
| n_sep_by_space | True, если символ валюты отделяется от отрицательного числа пробелом, и false — в противном случае
| p_sign_posn | Позиция знака для положительных денежных величин (см. табл. 11.1)
| n_sign_posn | Позиция знака для отрицательных денежных величин (см. табл. 11.1)
|
Таблица 11.1.
Позиции знака числа при выводе денежных единиц
Значение | Интерпретация
| 0 | Скобки вокруг числа и символа валюты
| 1 | Перед числом и символом валюты выводится знак числа
| 2 | Знак выводится после числа и символа валюты
| 3 | Знак выводится непосредственно перед символом валюты
| 4 | Знак выводится сразу после символа валюты
|
Элементы, в которые помещается информация о группировании, представляют
собой массивы, определяющие способ группирования отдельных разрядов выводимых чисел. Например, для буржуинской локали en_US эти массивы будут содержать всего два элемента: 3 и 3. Чем выше индекс элемента массива, тем более
старшим разрядам он соответствует. Если же значение элемента равно константе
CHAR_MAX, то никакого дальнейшего группирования не производится. Ну а если
элемент массива равен 0, то для группирования используется предыдущий элемент.
Листинг 11.1 демонстрирует небольшой пример, позволяющий сравнить настройки двух локалей.
Листинг 11.1. Сравнение настроек различных локалей
<html>
<titlе>Сравнение настроек различных локалей </title>
<body BGCOLOR="#FFFFFF">
<?php
$cur_loc = setlocale(LC_ALL,0) ;
// Вначале составим список из кодировок, установленных в системе
// Его можно получить с помощью locale -a
$locales = array ("С" , "af_ZA" , "cn_GB" , "en_US" , "es_DO" , "es_ES" ,
"fi__FI" , "fr_CA" , "ja_JP.sjis" , " ja_JP. ujis" ,
"pt_BR","ru_RU" . "sr_YU") ;
// Последовательно фиксируем соглашения локалей и помещаем
// их в ассоциативный массив, где ключом является имя локали
foreach ($locales as $key ) {
if (setlocale(LC_ALL, $key)) {
$locale_info[$key] = localeconvO ;
}
}
?>
<h2>Сопоставление настроек различных локалей</h2>
Текущее значение локали, используемое по умолчанию: <b
<?
print "$cur_loc </b><p>\n"; ?>
<table border=l>
<tr>t<h>Параметp</th>
<?
// Вначале выводим список имен локалей
foreach ($locale_info as $key => $value) {
print "<th>$key/<th>" ;
print "/<tr>\n"; // Завершаем строку
}
// Теперь собираем адреса строк
$rows = array_keys($locale_info["ru_RU"]);
foreach ($rows as $key) {
print "<tr><td><b>$key</b></td>";
print_info($key); // Теперь выводим строку по всем локалькам
} ?>
</table>
<?
function print_info($a)
{
global $locales, $locale_info; //He слишком оптимально, зато кратко...
foreach ($locale_info as $key => $value) {
// теперь $value - очередной массив локальки
$data = $value[$a]; // извлекаем данные // извлекаем данные
$data = $data ? $data : " "; // если не определены
$data = (Sdata == " ") ? "&quоt;&nbsр;&quоt;" : $data;
if (is_array($data)) { $data = implode(',', Sdata);}
print "<td>$data</td>";
}
echo "/<tr>\n"; }
?>
Результат работы этой программы приведен на рис. 11.1 .
Рис. 11.1. Далеко не все локали из числа доступных по команде locale -а реально определены в системе
11.3.2. Установка новой локали: setlocale
string setlocale (mixed category, string locale)
Функция предназначена для установки новой локали для одной или всех категорий, подлежащих установке. Аргумент category должен представлять собой именованную константу (или строку), обозначающую категорию функций, на которые должна оказать влияние новая установка:
LC_ALL | Глобальная установка всех перечисленных ниже категорий
| LC_COLLATE | Сортировка строк (используется strcoll ())
| LC_CTYPE | Используется такими функциями, как strtoupper () для классификации и преобразования букв
| LC_MONETARY | Установка представления денежных величин
| LC_NUMERIC | Определяет вид десятичного разделителя
| LC_TIME | Определяет формат представления даты и времени функцией strf time()
|
Если аргумент locale представляет собой пустую строку, имя локали извлекается из переменной окружения с тем же именем, что и запрошенная категория, или —
в случае отсутствия такой переменной — из переменной окружения LANG.
Если же этот аргумент равен нулю или представляет собой строку «О», настройки
локали не изменяются и возвращается ее текущее значение.
Функция setlocale возвращает новую текущую локаль или faIsе, если механизм
локален в данной системе не поддерживается, локаль для этого языка не реализо-
вана или имя категории неверно. В последнем случае PHP-машина также сгенерирует предупреждающее сообщение.
|