我正在为每种语言使用不同的路由表,并且我编写了更改语言并重定向到同一页面的操作,但是使用目标语言(和目标URL)。
主要问题是我的行为过于复杂 - 我怎样才能让它变得简单? 它应该改变语言并重定向到新的URL(用目标语言)。
简而言之:我们在一种语言中使用随机有效的蛋糕网址,我们不得不将其翻译成另一种语言的足够网址。
我的路由表:
if( 'en' == Configure::read('Config.language') ) {
Router::connect('/help', array('controller' => 'pages', 'action' => 'display', 'help') );
} else {
Router::connect('/pomoc', array('controller' => 'pages', 'action' => 'display', 'help') );
}
改变语言的行动:
function lang($lang) {
// getting previous url table
$url = $this->referer();
$url = Router::parse($url);
// changing language
if( in_array($lang, Configure::read('Languages.valid') ) ) {
$this->Session->write('Language', $lang);
Configure::write('Config.language', $lang);
}
// saving base params
$requestInfo = array(Router::getParams(), Router::getPaths());
// reload routing table
Router::reload();
include(CONFIGS.'routes.php');
// restore base params
Router::setRequestInfo($requestInfo);
// fix for 'pass' params
if(!empty($url['pass']) && is_array($url['pass'])) {
$url = array_merge($url, $url['pass']);
unset($url['pass']);
}
$this->redirect($url);
}
关于url表中的'pass'键:
/pages/display/help
在Router :: parse()之后,提取参数:
pass => array(
0 => 'help'
)
以后来自Router :: url()的返回值如下所示:
/pages/display/pass:Array
所以我必须通过将'pass'值与整个数组合并并删除键
来修复它答案 0 :(得分:0)
我有像这样的routes.php
Configure::write('Config.language', $_SESSION['lang']);
Router::connect(__('/help',true), array('controller' => 'pages', 'action' => 'display', 'help') );
所以我使用__()
来翻译网址。它在po文件中传输翻译。在您的lang()
函数中,将Session更改为当前语言后,您需要做的就是:
$this->redirect(__('/help'));
希望这有帮助
答案 1 :(得分:0)
我知道回答这个问题为时已晚,但对于那些遇到类似需求的人来说:
在routes.php p1
中标识静态页面(对所有语言都相同),可以是唯一标识页面的任何字符串。
Router::connect('/:language/p1/:translation', array(
'controller' => 'pages',
'action' => 'display',
'help',
'options' => array('language' => '[a-zA-Z]{2}')
) );
在你看来
$this->Html->link('Click me', array(
'language' => Configure::read('Config.language'),
'controller' => 'pages',
'action' => 'display',
'help',
'translation' => __('help') // could be any string in fact
));
将生成英语/en/p1/help
的链接,否则生成/xx/p1/pomoc
的链接。
可以在language
中将AppHelper::url()
参数注入每个链接,而不是在每个链接中都提供它。
如果要在控制器中重定向:
$this->redirect(array(
'language' => Configure::read('Config.language'),
'controller' => 'pages',
'action' => 'display',
'help',
'translation' => __('help')
));