Zend_Controller_Router: получить язык из переведенного сегмента - PullRequest
0 голосов
/ 08 февраля 2010

Я хочу использовать перезапись URL на моем сайте:

/:@controller/:@action/

Итак, я хочу использовать переведенные сегменты на маршруте и определить требуемый язык из этих переведенных сегментов. Например, если пользователь запрашивает URL-адрес, подобный этому:

/user/profile/

тогда я мог понять, что запрашиваемый язык - английский. И если пользователь запрашивает URL-адрес, как это:

/kullanici/profil/

тогда я не могу понять, что запрашиваемый язык - турецкий. Как я могу сделать это с Zend_Controller_Router?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2010

Мы решили нашу проблему, создав новый маршрутизатор с расширением Zend_Controller_Router_Route. Мы переопределили метод "match" класса и добавили несколько строк кода к исходному коду соответствия.

.....
foreach( $translateMessages as $key => $val ) {
  if (($originalPathPart = array_search($pathPart, $val)) !== false) {
    $pathPart = $originalPathPart;


    if (!$this->_localeSet) {
       $locale = Zend_Registry::get('Zend_Locale');
       $locale->setLocale($key);  // Set Locale by translated key language
       $this->_localeSet = true;  // Added to class with default value false
       $this->_activeLocale = $key;  // Added to class with default value ''
    }else{
       // A second translated key but this is not same language.
       // Then rise 404 error
       if ($this->_activeLocale != $key) {
          //FIXME: Rise 404 error
          throw new Exception("URL Not Found");
       }    
    }    
  }    
}    
.....
0 голосов
/ 08 февраля 2010

Я не знаю, если это такая хорошая идея. Потому что для этого нужно сначала определить язык хотя бы одного из сегментов маршрута. Для того, чтобы сделать это, вы должны либо заранее знать отображение (т. Е. Оно соответствует профилю маршрута, так что оно на английском или тукишском языке?) Или вам нужно будет отсканировать сегменты маршрута по словарю турецких / английских сегментов маршрута. Первый будет требовать от вас сделать 2 маршрута для каждого маршрута - один на турецком и один на английском, а второй потребует от вас уплаты штрафа за время обработки запроса сверх времени, которое уже требуется для фактического соответствия маршрут. ИМО лучше придерживаться типичного :lang/:controller/:action типа построения маршрута.

Тем не менее, если вы собираетесь это сделать, я создам новый тип маршрута для обработки соответствия URI языку. Это тогда установит языковой параметр для вас i18n, но также должен сбросить URI на конкретный базовый язык, который вы фактически соответствует стандартному маршруту. Затем я бы использовал Zend_Controller_Router_Route_Chain, чтобы связать их вместе.

...