CakePHP i18n / i10n路由

时间:2011-01-29 00:01:07

标签: cakephp routing cakephp-1.3

更新

我在几个应用程序中使用共享的CakePHP库(所有应用程序都存在于子域中)。它们并非全都嵌套;所以,例如,在我可能有的文件系统上:

/foo
  .htaccess
  /1.0 (app)
  /1.1 (app)
  /1.2 (app)
  ...
/bar
  .htaccess
  /1.0 (app)
  /1.1 (app)
  /1.2 (app)
  ...

其中每个.htaccess只定义哪个应用程序是请求被路由到该子文件夹的默认应用程序,而所有这些应用程序仍然可以通过直接URL(例如/foo/1.0/...)获得。

似乎如果我使用直接URL(例如不是.htaccess重写的),它会正确识别路由,但如果URL由.htaccess重写,则不会;它将使用问题末尾的输出调用AppError :: error404()。这对我来说似乎不对......如果有人有任何见解,那就太棒了。


嘿伙计们,

我正在使用CakePHP 1.3并遇到路由问题。这个概念的要点是:

  • 我想使用'en_us'样式i18n / i10n,而不仅仅是'en'
  • 我没有使用内置的i18n,因为要求让某些语言显示包含本地化视图的页面(views/:i18n/...),而其他语言则显示调用__()的常见视图

所以,我设置的路线如下:

$sI18nFormat = '/[a-z]{2}_[a-z]{2}/';
Router::connect('/:i18n/:controller/:action',
    array('controller' => ':controller', 'action' => ':action', 'i18n' => ':i18n'),
    array('i18n' => $sI18nFormat));
Router::connect('/:i18n/:controller',
    array('controller' => ':controller', 'action' => 'index', 'i18n' => ':i18n'),
    array('i18n' => $sI18nFormat));
Router::connect('/:controller/:action',
    array('controller' => ':controller', 'action' => ':action', 'i18n' => 'en_us'),
    array('i18n' => $sI18nFormat));
Router::connect('/:controller',
    array('controller' => ':controller', 'action' => 'index', 'i18n' => 'en_us'),
    array('i18n' => $sI18nFormat)); 

显然路由是镜像的,除了一个传递了动态i18n参数,另一个具有静态参数。

问题来自于使用:i18n的某些值 - 例如,en_us没问题,但fr_fr似乎有Cake正在寻找FrController(不是{{1} }) - 似乎是因为它试图使用内置的i18n FrFrController前缀来处理一些魔法。

举个例子,这里给出的是fr

AppError::error404

是否有可能a)让Cake停止这个让我的路线按预期工作,或者b)告诉Cake我想要我的i18n / i10n的格式,所以它不会尝试以自己的方式做到这一点?

任何想法都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

您不应该(需要)划分正则表达式,也不需要填充默认参数。试试这个:

$sI18nFormat = '[a-z]{2}_[a-z]{2}';
Router::connect('/:i18n/:controller/:action', array(), array('i18n' => $sI18nFormat));

它可能也失败了,因为URL与完整定义的路由不匹配。即,/fr_fr/foo与上述路线不匹配,因为它不包含:action。尝试添加更短的变体:

Router::connect('/:i18n/:controller', array('action' => 'index'), array('i18n' => $sI18nFormat));
Router::connect('/:i18n', array('controller' => 'foo', 'action' => 'index'), array('i18n' => $sI18nFormat));

答案 1 :(得分:1)