CakePHP i18n/i10n路由

CakePHP i18n/i10n路由,cakephp,routing,cakephp-1.3,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

更新:

我在几个应用程序中使用了一个共享的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),它会正确地识别路由,但是如果URL是由.htaccess重写的,它不会;它将调用AppError::error404(),并在问题末尾使用输出。这对我来说似乎不对。。。如果有人有任何见解,那就太棒了


嘿,伙计们

我使用的是CakePHP1.3,有一个路由问题。这一概念的要点是:

  • 我想使用‘en_us’风格的i18n/i10n,而不是简单的‘en’
  • 我没有使用内置的i18n,因为要求某些语言显示带有本地化视图(
    视图/:i18n/…
    )的页面,而其他语言显示带有调用
    。\uuuu()
所以,我有这样设置的路线:

$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
似乎有蛋糕在寻找
FrController
(而不是
FrController
)-似乎是因为它试图用内置的i18n
fr
前缀发挥某种魔力

作为一个例子,这里给出了
AppError::error404

Array
(
    [className] => FrController
    [webroot] => /path/to/webroot
    [url] => _fr
    [base] => /path/to/webroot
)
有没有可能a)让Cake停止这样做,以便我的路由按预期工作,或者b)告诉Cake我希望我的i18n/i10n采用什么格式,这样它就不会尝试按自己的方式工作

如果您有任何想法,我们将不胜感激。

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

$sI18nFormat = '[a-z]{2}_[a-z]{2}';
Router::connect('/:i18n/:controller/:action', array(), array('i18n' => $sI18nFormat));
它可能也会失败,因为URL与完整定义的路由不匹配。也就是说,
/fr\u fr/foo
将与上述路线不匹配,因为它不包含
:action
。还可以尝试添加较短的变体:

Router::connect('/:i18n/:controller', array('action' => 'index'), array('i18n' => $sI18nFormat));
Router::connect('/:i18n', array('controller' => 'foo', 'action' => 'index'), array('i18n' => $sI18nFormat));
你看过p28n了吗


我发现它让整个事情变得不那么简单。

顺便说一句,它是“i18n”(eye-18-en)和“l10n”(ell-10-en)。:)哈哈,太对了。。。漫长的一天这肯定有点太冗长了。。。愉快地删除了不必要的部分。问题是——我认为只有参数本身与正则表达式匹配,而不是整个URI?如果我有一个定义的路由
/:i18n/:controller
,它指向
:action=>index
,为什么它不匹配
/fr\u fr/foo
(例如)?在我解决了.htaccess问题后,一切都按预期工作。非常感谢。我以前确实研究过这个问题,但我对需要(有效地)重定向控制器来切换语言感到有点厌烦。我希望语言由URI控制,而不是由会话控制。。。在这方面,p28n~=库存i18n。。。除非我错过了一些重要的东西。如果我是,请给我提示!