Как стать автором
Обновить

I18n без URL

Время на прочтение2 мин
Количество просмотров3.5K
Недавно на работе столкнулся с интересной, на мой взгляд, задачей. На разрабатываемом сайте подразумевалось использование трех языков — украинский, русский, английский. Задача решалась с помощью фреймворка symfony 1.2. В принципе, стандарт, кроме одного пункта. УРЛа русской версии должна была выглядеть так: frontend_dev.php/articles/about английской и украинской соответственно frontend_dev.php/eng/articles/about frontend_dev.php/ukr/articles/about.

Задачу решил таким способом. В первую очередь создаем в файле routing.yml два пути — один для версии языка по-умолчанию, который не отображает сам язык в УРЛе, другой — для все остальных. Выглядит это примерно так:
page:
url: /:sf_culture/:first/:second/:third
requirements: { sf_culture: (?:rus|eng|ukr) }
param: { module: page, action: list, first: none, second: none, third: none}

page_no_lang:
url: /:first/:second/:third
param: { module: page, action: pageNoLang, first: none, second: none, third: none}



Очевидно, создаем два Action'а, в одном из них pageNoLangSuccess() вставляем строку перевода в нужный язык:
$culture = $this->getUser()->setCulture('rus');
// далее какой-то код


Во втором просто выполняем действия над данными как обычно. Впрочем, так как действия одни и те же для обоих Action'ов я вынес их в отдельную функцию — чтоб не повторяться.
Ссылки на переключения языка выглядят почти стандартно:
<?php echo @link_to('rus', '@page_no_lang?sf_culture=rus'.$link, '') ?> |
<?php echo @link_to('en', '@page?sf_culture=eng'.$link) ?> |
<?php echo @link_to('ukr', '@page?sf_culture=ukr'.$link) ?>

но переход на язык по-умолчанию осуществляется через путь @page_no_lang
Единственный неприятный момент — ссылки на внутренние структуры. Тут пришлось отказаться от link_to и для русского языка прописывать вручную:
<?php if($sf_user->getCulture() == 'rus' ): ?>
a href="frontend_dev.php/articles">Ссылка

<?php else: ?>
<?php echo link_to('Ссылка', '@articles); ?>
<?php endif; ?>


Вот вроде-бы и все. Решение, на мой взгляд, не очень элегантное, но работает. Если у кого-то есть идеи, как это можно реализовать красивее — заранее спасибо.
Теги:
Хабы:
-2
Комментарии10

Публикации

Истории

Работа

PHP программист
157 вакансий

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн