Отправляет email-рассылки с помощью сервиса Sendsay

PHP 5: Новые возможности.

  Все выпуски  

ZEND FRAMEWORK: Класс Zend_Locale


PHP 5: Новые возможности.

В предлагаемом материале рассказывается об основах интернационализации и локализации приложений с помощью класса Zend_Locale.

Для того, чтобы приложением или веб сайтом можно было пользоваться во всем мире, а не только в стране разработчика, недостаточно просто перевести встречающиеся строки на разные языки. Дело в том, что в разных странах существуют различные стандарты отображения дат, чисел и мер, различные традиции написания имен, различные названия национальных валют и т. п. В зависимости от географического местонахождения могут отличаться обычаи носителей даже одного и того же языка (например, у англичан в Великобритании, США, Канаде и Австралии или у португальцев в Португалии и Бразилии).

Адаптация продукта для такого потенциального повсеместного использования называется интернационализацией (internationalization, или I18N, где число 18 символизирует количество пропущенных букв между первой и последней), а реализация конкретных возможностей использования теми или иными относительно компактными группами - локализацией (localization, или L10N). Интернационализация и локализация тесно между собой связаны и взаимно дополняют друг друга. [1]

Zend Framework обладает достаточно полным набором средств для обеспечения интернационализации и локализации разрабатываемых приложений. Это - классы Zend_Locale, Zend_Translate, Zend_Date, Zend_Calendar, Zend_Currency, Zend_Locale_Format, Zend_Locale_Data и др. Часть из них, впрочем, еще не включены в официальную поставку и находятся в т. н. «инкубаторе».

Локаль представляет собой набор параметров, определяющих язык и страну пользователя [1]. Она представлена идентификатором, состоящим из двух частей: двухбуквенного языкового кода в нижнем регистре и двухбуквенного кода региона в верхнем регистре, соединенных знаком подчеркивания. Например, en_US (английский язык, США), ru_RU (русский язык, РФ), tt_RU (татарский язык, РФ), uk_UA (украинский язык, Украина), ka_GE (грузинский язык, Грузия) и т. д. Более подробные перечень приведен в секции «Поддерживаемые языки и регионы».

Класс Zend_Locale занимает центральное место в обеспечении локализации приложений, предоставляя поддержку доступных локалей, в том числе, остальным компонентам Zend Framework. Таким образом, эти компоненты получают возможность строить свое поведение с учетом текущей локали.

В большинстве случаев разумнее всего позволить локали установиться автоматически.

$locale = new Zend_Locale;

В этом случае локаль будет установлена на основании настроек пользовательского броузера (переменная $_SERVER['HTTP_ACCEPT_LANGUAGE']). Если таким образом получить нужную информацию не удастся, будут проанализированы настройки сервера и, в последнюю очередь, настройки Zend Framework (последняя возможность в настоящее время еще не реализована).

Приоритет потенциальных источников информации может быть изменен.

$locale = new Zend_Locale(Zend_Locale::BROWSER);        // browser - server - ZF (default)
$locale = new Zend_Locale(Zend_Locale::ENVIRONMENT);    // server - ZF - browser
$locale = new Zend_Locale(Zend_Locale::FRAMEWORK);      // ZF - server - browser

При необходимости локаль может быть задана явным образом.

$locale = new Zend_Locale('de_DE'); // German language _ Germany

Ниже приведены (без комментариев, поскольку смысл использования представляется достаточно ясным и так) несколько примеров применения объектов класса Zend_Locale.

$locale = new Zend_Locale;
$serializedLocale = $locale->serialized();
$localeObject = unserialize($serializedLocale);
$copiedLocale = clone $locale;
echo "copied: ",
$copiedLocale->toString();
echo "copied: ", $copiedLocale;
if ($locale->isEqual($mylocale) { /* ... */ }
$found = $locale->getDefault(); // array
$locale->setLocale('fr_FR');
$lang = $locale->getLanguage();
$region = $locale->getRegion();
print $locale->getLanguageDisplay('de'); // German
print_r($locale->getQuestion());    // en_US
Array
(
    [yes] => yes
    [yesabbr] => y
    [no] => no
    [noabbr] => n
)        

Под нормализацией подразумевается разбор введенных данных (в данном случае, чисел и дат) и приведение их к некому стандартизованному виду.

Например, дата 01/02/03 будет означать 1 февраля 2003 года для пользователя в России, но 2 января 2003 года для пользователя в США. А в определенных условиях эту дату можно интерпретировать и как 3 февраля 2001 года. В нормализованном же виде это будет, скажем, массив с отдельными элементами, однозначно соответствующими дню, месяцу и году.

За нормализацию чисел и дат отвечает класс Zend_Locale_Format, который используется и другими компонентами Zend Framework.

Нормализовать число позволяет статический метод getNumber(). Второй параметр - точность (количество десятичных знаков после запятой).

print Zend_Locale_Format::getNumber('12,345.67', 2, $locale);    // en_US
12345.67

Представить нормализованное число в традиционном для данной локали формате (т. е. локализовать его) можно с помощью статического метода toNumber().

print Zend_Locale_Format::toNumber(1234567890, false, $locale);   // en_US
1,234,567,890
print Zend_Locale_Format::toNumber(1234567890, false, $locale);   // ru_RU
1 234 567 890

Проверить, является ли число валидным в заданной локали, позволяет статический метод isNumber().

if (Zend_Locale_Format::isNumber('12.345,67', 'de_AT')) { /* ... */ }

Наконец, статический метод toNumberSystem() позволяет преобразовывать числа из одной системы счисления в другую.

print Zend_Locale_Format::toNumberSystem('123', 'Euro', 'Arab');

Ниже приведены коды некоторых поддерживаемых языков и регионов. Полный их список приведен в поставляемой с Zend Framework документации [11].

Таблица 15.1. Поддерживаемые языки
КодЯзык
arАрабский
beБелорусский
deНемецкий
enАнглийский
frФранцузский
jaЯпонский
ruРусский
ukУкраинский
zhКитайский
Таблица 15.2. Поддерживаемые регионы
КодРегион
AUАвстралия
BYБеларусь
CAКанада
CNКитай
DEГермания
FRФранция
GBВеликобритания
JPЯпония
RUРоссия
UAУкраина
USСША

Created with DocBook


В избранное