0

将此解决方案用于我的 CakePHP 2.3 网站的 i18n。

当此 URL 中的用户:example.com/myController/myAction/param1/param2
我想提供指向example.com/eng/myController/myAction/param1/param2 This 的链接时,我的视图文件中的此代码效果很好:

<a href="/eng<?php echo $this->here;?>">English</a>

但是当这个 URL 中的用户:example.com/fre/myController/myAction/param1/param2
我无法将他链接到这个 URL:example.com/eng/myController/myAction/param1/param2

我可以通过以下方式获取完整的 URL:

fullURL = Router::url( $this->here, true );
$strippedURL = str_replace("http://example.com/fre/myController/myAction/param1/param2","myController/myAction/param1/param2",$fullURL)

但我需要为每种语言制作这个。或者我可以从$fullURL. 但它们似乎不是好的解决方案。你有什么建议吗?

编辑:在我的 Helper/View 文件中,我使用了这个:

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)."/";
  }
}

如果您能推荐更好的选择,我会很高兴。

4

1 回答 1

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 ) );
}

并在视图中使用它,如下所示:

foreach ($languages as $lang=>$langDesc) {
    echo $this->Html->link($languageDesc, $this->Html->urlLanguage($lang));
}

其中 $languages 是一个包含所有可用语言的数组。我跳过了链接本身的 HTML。我按照此处的说明设置路线和语言切换。

于 2013-04-11T11:46:55.570 回答