PHP-4 Эффективная работа


Установка локали в Linux
Подготовка локали к работе
Поддержка локали в РНР
Предикаты, основанные на локали
Функции библиотеки GNU Recode
Нечаянная радость: convert_cyr_string
Поддержка NLS

11.3.Поддержка локали в РНР

Поддержка локали в РНР реализована в виде двух групп функций. Первая группа, которую мы рассмотрим в данном разделе, является «глобальной». Входящие в нее функции 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_spaceTrue, если символ валюты отделяется от положительного числа пробелом, и false — в противном случае
n_cs_precedesTrue, если символ валюты выводится перед отрицательным значением, и 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-машина также сгенерирует предупреждающее сообщение.

назад
далее

Сайт управляется системой uCoz