Используйте 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 в нужных местах. Я надеюсь, что это вам пригодится.