PHPixie Amalgama — Интернационализация в PHPixie

Я уже достаточно давно использую 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 \PHPixie\Amalgama\Pixie {
  ...
  protected function after_bootstrap() {
    parent::after_bootstrap();
  }
}

Там-же определим модуль вот так:

protected $modules = array(
  ...
  'amalgama' => '\PHPixie\Amalgama'
);

Расширим наш базовый контроллер:

<?php

namespace App;

class Page extends \PHPixie\Amalgama\Controller {

  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 для правильной генерации адресов из маршрутов и View\Helper, что-бы удобно переводить во вьюхах.

Использование


Благодаря хелперу, в представлениях для перевода строки можно использовать такую сокращенную запись:

<?php echo $__('Hello World!'); // выведет "Привет мир!" для русского языка ?>
<?php echo $__('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
Поделиться публикацией
Похожие публикации
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 6
  • 0
    Можно ли варьировать перевод в зависимости от параметра в стиле
    {0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples
    
    ?
    • +1
      На данный момент нет. Но подобный функционал уже в процессе, кажется осталось только немного протестировать и самое нелюбимое — задокументировать.
      • +1
        Я теперь стал намного больше любить писать тесты и документацию. Мне кажется что я как-то сделал круг: сначала мне нравилось придумывать архитектуру и писать код, а тесты и доки были как домашнее задание. Но со временем, когда архитектура стала сложнее, сидеть и переворачивать ее в голове, переписывать по 20 раз интерфейсы и начинать все сначала стало утомлять. А вот усестся с кофе и под фильм писать тесты вставляя шутки в документацию стало любимым делом =)
        • +1
          вставляя шутки в документацию
          — лишь бы не черный юмор ;)
          • 0
            jigpuzzled а напомни ту самую сексистскую шутку из твиттера? ;)
            я думаю, народ её тут оценит )
            • 0
              Боюсь моя карма такого не переживет =)
              А шутка то вообще-то не сексистская, я ее с таким же успехом мог бы и мужыку написать.

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