0

Я хочу использовать URL переписывания на моем сайте:Zend_Controller_Router: Получить язык из переведенного сегмента

/:@controller/:@action/ 

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

/user/profile/ 

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

/kullanici/profil/ 

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

ответ

0

Мы решили проблему, создав новый маршрутизатор с расширением 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

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

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

+1

Нехорошо использовать английские слова на URL-адресе для полностью турецкой страницы для методов SEO. И использование турецких слов для английских страниц также ... В нашей конфигурации маршрутизатора Zend framework уже получает запрошенный контроллер из этого типа переведенных сегментов. Проблема только в том, что я не мог получить, какой перевод использовал при получении текущего контроллера. Если я использую несколько маршрутов для каждого языка, мое управление URL-адресом уродливо, я не могу генерировать динамические URL-адреса и т. Д. Если это возможно, я хочу использовать одно правило для всех языков. –

+0

@Murat: «Проблема только в том, что я не мог получить, какой перевод использовался при получении текущего контроллера». Мне жаль, что вы можете перейти сюда немного подробнее? Кажется, что если ZF работает так, как вы заявляете, то «locale» должен быть доступен где-то в стеке приложений, например, в запросе или в Bootstrap. Где происходит перевод в настоящее время? – prodigitalson