Внешние ссылки и механизм маршрутизации CakePHP (многоязычный) - PullRequest
0 голосов
/ 15 сентября 2010

Недавно я создал маленькое «расширение» маршрутизации, которое вызывает маршруты из таблицы MySQL (структура вниз).Я думаю, стоит упомянуть, что эта страница работает на нескольких языках (немецкий и английский).Итак - полагаясь на cookie , который в данный момент установлен в браузере клиента - соответствующие маршруты получают подключено .

Проблема в том, что если пользователь не может (внешне) быть привязанным к немецкой контентной странице, если языковой файл cookie его браузера был установлен на английский язык (поскольку английские маршруты были подключены).

У кого-нибудь есть подходящее решение для этого?Честно говоря, я не знаю, как программно расширить функциональность класса маршрутизатора .


Структура таблицы MySQL выглядит следующим образом:

CREATE TABLE `routes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `language` varchar(5) COLLATE latin1_general_ci NOT NULL DEFAULT 'de',
  `route` varchar(64) COLLATE latin1_general_ci NOT NULL,
  `controller` varchar(64) COLLATE latin1_general_ci NOT NULL,
  `action` varchar(64) COLLATE latin1_general_ci NOT NULL,
  PRIMARY KEY (`id`)
)

1 Ответ

1 голос
/ 15 сентября 2010

Используйте p28n - http://bakery.cakephp.org/articles/view/p28n-the-top-to-bottom-persistent-internationalization-tutorial

Работает хорошо, я часто его использую, и теперь это часть моей стандартной сборки.

У меня также есть скрипт, который будет возвращать переведенные URL в зависимости от выбранного языка. Я не могу вспомнить, где я нашел сценарий, на котором он основан, но если это поможет, я могу попытаться отправить вам чистую версию.

РЕДАКТИРОВАТЬ: Хорошо, вот кости:

Этот скрипт переведет URL-адреса, чтобы они оставались оптимизированными для SEO. Переключение языков и перевод сообщений обрабатываются p28n (выше) и po.

Поместите эту строку в файл app/config/bootstrap.php:

include_once("translate.php");

Поместите это как первую строку кода в app/config/routes.php:

$fromUrl = translate($fromUrl,true);

Теперь вам нужно создать файл app/config/translate.php, который содержит всю информацию о маршрутизации:

function translate($str = null,$total = false)
{
    // If this is an RSS route, ignore it and bounce straight out
    if (strpos($str,".rss")!==false)
            return $str; 
    $translatetable = array(    
                         'some-url-in-german' => array('/articles/msome-url-in-german',1),
                         'some-url-in-english' => array('/articles/some-url-in-german',2),

                         'a-german-article' => array('/posts/a-german-article',1),
                         'an-english-article' => array('/posts/a-german-article',2)
                           );
    if($str)
    {
        if($total)
        { 
            $old = explode('/',$str);
            $lastone = end($old);
            if(empty($lastone)) array_pop($old);
            $new = array();
            /* translate each part or leave untranslated part */
            for($i = 0 ; $i <sizeof($old) ; $i++)
            {
                $new[$i] = translate($old[$i]);
            }
            /* construct the translated url. This also adds 
               a trailing "/" even if it wasn't in the original */
            $new_url="";
            foreach($new as $n)
            {
                $new_url .= $n."/";
            }
            return $new_url;
         }
         else
         {
             foreach ($translatetable as $orig => $new)
             {
                 if($str == $orig) 
                 {
                     $str = $new[0];
                     switchLanguage($new[1]);
                 }
             }
                return $str;
         }
     }
 }

 function switchLanguage($lang)
 {
     if($lang>0)
     { 
         $translatetable = array(
                                '1' => 'de',                                                
                                '2'=> 'eng'
                                 );
         Configure::write(array('Config.language'=>$translatetable[$lang]));
     }
 }

Это довольно просто на самом деле - хитрость заключается в том, чтобы заставить его загружаться в CakePHP в нужных местах. Я надеюсь, что это вам пригодится.

...