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

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

  Все выпуски  

ZEND FRAMEWORK: Создание многоязычного приложения.


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

Наличие интеллектуального многоязычного интерфейса является одним из признаков профессионально разработанного приложения и облегчает его распространение. Сейчас нам предстоит разработать основу для такого интерфейса путем создания и регистрации локали и ее последующего использования для создания многоязычного меню и показа отдельных страниц с учетом предпочитаемого языка пользователя, который определяется настройками броузера.

Кроме того, интерфейс должен обеспечивать принудительный выбор языка самим пользователем.

Создадим новый объект класса 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
{
    public function IndexAction()
    {
        $this->_redirect($_SERVER['HTTP_REFERER']);
    }

    public function EnAction()
    {
        /* TO DO */
        $this->_redirect($_SERVER['HTTP_REFERER']);
    }

    public function RuAction()
    {
        /* TO DO */
        $this->_redirect($_SERVER['HTTP_REFERER']);
    }
}

        
[Замечание]Замечание

Конкретную реализацию методов контроллера отложим до следующего практического занятия (см. Глава 26, Использование сессий).

На страницах приложения в таком случае следует разместить ссылки следующего вида.

<a href="/lang/en/">EN</a>
<a href="/lang/ru/">RU</a>
        

После обработки заданного действия броузер будет перенаправлен на страницу, с которой это действие было вызвано.

Примером реализации описанного механизма переключения языков может служить онлайновая версия электронной книги «Погружение в PHP 5: Графика», доступная на трех языках: английском, русском и украинском.

Вывод меню на предпочитаемом пользователем языке легко обеспечить с помощью класса Zend_Translate. Предположим, что использован адаптер для массивов.

<?php

$en = array(
    'option_1' => 'Option 1',
    'option_2' => 'Option 2',
    'option_3' => 'Option 3'
);

$ru = array(
    'option_1' => 'Опция 1',
    'option_2' => 'Опция 2',
    'option_3' => 'Опция 3'
);

$locale = Zend_Registry::get('locale');
$lang = $locale->getLanguage();
$translate = new Zend_Translate('array', $$lang, $lang);

$option_1 = $translate->_('option_1');
$option_2 = $translate->_('option_2');
$option_3 = $translate->_('option_3');

print <<<EOT
<a href="page1.php">$option_1</a>
<a href="page2.php">$option_2</a>
<a href="page3.php">$option_3</a>
EOT;
        

При наличии страниц с одинаковым контентом на нескольких языках, их хранение и показ может быть организован следующим образом.

Страницы на одном языке «складываются» в отдельную директорию, название которой совпадает с кодом языка (en, ru и т. д.). Контроллер анализирует текущую локаль и добавляет название директории к запрошенной странице.

<?php

$view = new Zend_View;
$locale = Zend_Registry::get('locale');
$lang = $locale->getLanguage();
$view->page = "$lang/foo.html";
print $view->render('script.php');
        

Скрипт вида сможет считать адрес запрошенной страницы ($this->page) и вернуть ее содержание.

return file_get_contents($this->page);

Created with DocBook


В избранное