CakePHP i18n/i10n路由
更新: 我在几个应用程序中使用了一个共享的CakePHP库(它们都位于子域中)。它们并非都是相同的嵌套;例如,在文件系统上,我可能有: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
/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
)-似乎是因为它试图用内置的i18nfr
前缀发挥某种魔力
作为一个例子,这里给出了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。。。除非我错过了一些重要的东西。如果我是,请给我提示!