На текущем практическом занятии предпринимается попытка разработки скелета для многоязычных приложений; в частности, рассмотрен способ использования локали для создания меню и показа отдельных страниц в зависимости от языковых настроек броузера пользователя, а также явным образом заданного языка самим пользователем.
Постановка задачи
Наличие интеллектуального многоязычного интерфейса является одним из признаков профессионально разработанного приложения и облегчает его распространение. Сейчас нам предстоит разработать основу для такого интерфейса путем создания и регистрации локали и ее последующего использования для создания многоязычного меню и показа отдельных страниц с учетом предпочитаемого языка пользователя,
который определяется настройками броузера.
Кроме того, интерфейс должен обеспечивать принудительный выбор языка самим пользователем.
Использование локали
Создадим новый объект класса Zend_Locale в файле начальной загрузки.
$locale = new Zend_Locale;
Созданная таким образом локаль
по умолчанию установит текущий язык на основании настроек броузера пользователя, а именно, переменной $_SERVER['HTTP_ACCEPT_LANGUAGE']Глава 16, Класс Zend_Locale. Такое поведение выглядит наиболее логичным, но при необходимости можно задать установку языка и явным образом.
Затем следует зарегистрировать
только что созданный объект локали, чтобы обеспечить доступ к ней из разных мест приложения в последующем.
Zend_Registry::set('locale', $locale);
Теперь при необходимости локаль в любой момент можно извлечь из регистра.
$locale = Zend_Registry::get('locale');
Изменение языка
Помимо автоматического определения предпочитаемого языка, пользователю следует предоставить возможность изменять язык явным образом (в том числе, на несовпадающий с предпочитаемым). Для этого можно, например, разработать дополнительный контроллер.
<?php
class LangController extends Zend_Controller_Action
{
publicfunction IndexAction()
{
$this->_redirect($_SERVER['HTTP_REFERER']);
}
publicfunction EnAction()
{
/* TO DO */
$this->_redirect($_SERVER['HTTP_REFERER']);
}
publicfunction RuAction()
{
/* TO DO */
$this->_redirect($_SERVER['HTTP_REFERER']);
}
}
Замечание
Конкретную реализацию методов контроллера отложим до следующего практического занятия (см. Глава 26, Использование сессий).
На страницах приложения в таком случае следует разместить ссылки следующего вида.
После обработки заданного действия броузер будет перенаправлен на страницу, с которой это действие было вызвано.
Примером реализации описанного механизма переключения языков может служить онлайновая версия электронной книги «Погружение в PHP 5: Графика», доступная на трех языках: английском, русском и украинском.
Перевод меню
Вывод меню на предпочитаемом пользователем языке легко обеспечить с помощью класса Zend_Translate. Предположим, что использован адаптер для массивов.
При наличии страниц с одинаковым контентом на нескольких языках, их хранение и показ может быть организован следующим образом.
Страницы на одном языке «складываются» в отдельную директорию, название которой совпадает с кодом языка (en, ru и т.
д.). Контроллер анализирует текущую локаль и добавляет название директории к запрошенной странице.