我将this solution用于我的CakePHP 2.3网站的i18n。
此网址中的用户:example.com/myController/myAction/param1/param2
我想提供example.com/eng/myController/myAction/param1/param2
的链接
这适用于我的视图文件中的此代码:
<a href="/eng<?php echo $this->here;?>">English</a>
但是,当此网址中的用户:example.com/fre/myController/myAction/param1/param2
我无法将他与此网址相关联:example.com/eng/myController/myAction/param1/param2
我可以通过以下方式获取完整的网址:
fullURL = Router::url( $this->here, true );
$strippedURL = str_replace("http://example.com/fre/myController/myAction/param1/param2","myController/myAction/param1/param2",$fullURL)
但我需要为每种语言都做到这一点。或者我可以从$fullURL
中删除前22个字符。但它们似乎不是很好的解决方案。
你有什么建议吗?
编辑:在我的帮助/查看文件中,我使用了这个:
function getRelURL() {
$controller = $this->request->params['controller'];
$action = $this->request->params['action'];
$URL = "/".$controller."/".$action."/";
foreach ($this->request->params['pass'] as $p) {
$URL .= urlencode($p)."/";
}
}
如果你能推荐更好的选择,我会很高兴。
答案 0 :(得分:0)
我使用了稍微不同的方法似乎运行良好,即使我没有使用命名参数和所有其他路由功能进行测试。 我在AppHelper中创建了以下函数:
public function urlLanguage($lang) {
static $hereUrl=null;
if (empty($hereUrl)) {
$hereUrl = $this->request->params;
unset ( $hereUrl ['models'] );
unset ( $hereUrl ['named'] );
unset ( $hereUrl ['paging'] );
if (isset ( $hereUrl ['pass'] )) {
foreach ( $hereUrl ['pass'] as $pass ) {
$hereUrl [] = $pass;
}
unset ( $hereUrl ['pass'] );
}
}
return array_merge( $hereUrl, array ('language' => $lang ) );
}
并在View中使用它,如下所示:
foreach ($languages as $lang=>$langDesc) {
echo $this->Html->link($languageDesc, $this->Html->urlLanguage($lang));
}
其中$ languages是一个包含所有可用语言的数组。我跳过链接本身的HTML。 我按照here的说明设置了路由和语言切换。