Я уже достаточно давно использую PHPixie в работе и очень доволен, единственное чего мне не хватало — это поддержка многоязычности. Так как я работаю в Казахстане, большинство заказчиков хотят на своем сайте несколько локализаций, особенно это касается государственных учреждений. PHPixie был моим первым фреймворком, переходить на что-то другое не хотелось(хотя признаюсь чуть не изменил со старушкой коханой) и я писал «уродливые костыли», что-бы реализовать мультиязычность. В этой статье речь пойдет о моём новом вполне удобном и изящном «костыле», которым я решил поделиться — модуле «PHPixie Amalgama».
О модуле
В арсенале модуль имеет базовый функционал для работы с переводами строк, а так-же небольшое расширение для тех, кто не хочет прописывать параметры языка в маршрутах. Модуль легко установить, легко настроить, удобно использовать для многих задач.
Установка и настройка
Прописываем пакет в секцию «require» файла «composer.json» вот так:
"phpixie/amalgama": "2.*@dev"
Выполним в директории сайта такую команду:
php composer.phar update -o --prefer-dist
Добавим конфиг amalgama.php в /assets/config/ и пропишем наши настройки:
return array(
// Список используемых языков
'list' => array('en', 'ru', 'kk'),
// Язык по умолчанию
'default' => 'en',
// Расширение, позволяющее использовать обычные маршруты
'autorouting' => true,
// Регулярка для имен маршрутов, которые нужно исключить из автороутинга
'autoroutingExcept' => '^admin_'
);
Расширим наш Pixie.php:
namespace App;
class Pixie extends PHPixieAmalgamaPixie {
...
protected function after_bootstrap() {
parent::after_bootstrap();
}
}
Там-же определим модуль вот так:
protected $modules = array(
...
'amalgama' => 'PHPixieAmalgama'
);
Расширим наш базовый контроллер:
<?php
namespace App;
class Page extends PHPixieAmalgamaController {
public function before() {
parent::before();
...
}
...
}
Определяем маршруты, если autorouting false:
'default' => array(
array('(/<lang>)(/<controller>(/<action>(/<id>)))', array('lang' => '(en|ru|kk)')
array(
'controller' => 'hello',
'action' => 'index',
'lang' => 'en'
),
),
Добавляем файлы перевода в директорию /assets/config/amalgama:
//ru.php
<?php
return array(
'Hello World!' => 'Привет мир!',
'Hello <?>!' => 'Привет <?>!'
);
//kk.php
return array(
'Hello World!' => 'Cәлем әлем!',
'Hello <?>!' => 'Cәлем <?>!'
);
Как видите переводы поддерживают параметры, а для языка по умолчанию переводы прописывать не нужно.
Так-же следует сказать о том, что модуль сам расширяет класс Route для правильной генерации адресов из маршрутов и ViewHelper, что-бы удобно переводить во вьюхах.
Использование
Благодаря хелперу, в представлениях для перевода строки можно использовать такую сокращенную запись:
<?php $__('Hello World!'); // выведет "Привет мир!" для русского языка ?>
<?php $__('Hello <?>!', array('Хабр'); // выведет "Привет!" для русского языка ?>
Вывести переключатель языков тоже очень просто:
<?php foreach($this->helper->getLangList() as $lang) : ?>
<?php if ($lang == $this->helper->getCurrentLang()) : ?>
<span><?php echo $lang; ?></span>
<?php else: ?>
<a href="<?php echo $this->helper->langSwitchLink($lang); ?>"><?php echo $lang; ?></a>
<?php endif; ?>
<?php endforeach; ?>
Модуль Paginate работает как надо, только не забываем передавать текущий язык:
$page = $this->request->param('page');
$comments = $this->pixie->orm->get('comment');
$pager = $this->pixie->paginate->orm($comments, $page, 10);
$pager->set_url_route('comments', array('lang' => $this->lang));
Ну и как же без валидации:
$validator->field('username')
->rule('filled')
->error($this->__('Field <?> must not be empty', array($this->__('username'))));
Заключение
Как можно заметить PHPixie очень легко расширяется. Для большинства небольших проектов в ней есть все, что нужно, а если чего-то не хватает, то дописать самому не составит труда. В будущем планируется поддержка множественного числа, базовый функционал уже есть, но нет пока времени довести до ума и писать документацию. Переводить с русского без особых напрягов можно и с таким функционалом. Если найдёте баг, ошибки в документации или есть какие-нибудь идеи, буду рад отзывам и пулреквестам.
Репозиторий модуля здесь: Github
Автор: nxeed