我正在尝试在我的网站中实施本地化。目前,基本(英语)网站位于http://domain.com/controller/action,我希望每个本地化位于http://domain.com/locale/controller/action。基本上,如果用户访问后一个URL,Kohana将使用与英文版相同的控制器和操作。在代码中,我将简单地交换字符串。
目前,我尝试添加以下路线但不起作用:
// This is my default route:
Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' => '.*?'))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
// This the route for the localizations:
Route::set('locale', '(<locale>(/<controller>(/<action>(/<overflow>))))', array('overflow' => '.*?'))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
使用此设置,如果我访问http://domain.com/es/controller/action,我将收到404错误。知道如何设置我的路线以使其工作吗?
修改
只是为了完成matino和John Himmelman的回答,如果我按照建议简单地交换规则,它就会起作用。但是,“locale”路由将成为全能路由,并且总是必须指定语言环境,即使您需要的只是默认路由(在我的情况下为“en”/英语) )。要解决此问题,您可以将“locale”参数限制为您支持的语言环境。例如:
Route::set('locale', '(<locale>(/<controller>(/<action>(/<overflow>))))', array('locale' => '(fr|zh|en)', 'overflow' => '.*?'))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' => '.*?'))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
在这种情况下,只支持以“fr”,“zh”或“en”开头的网址。此外,不受支持的区域设置将返回404错误,“domain.com/controller/action”将正确显示默认的英语区域设置。
答案 0 :(得分:2)
Kohana按照它们在引导程序中出现的顺序应用路线。这就是为什么你的默认/全部捕获路线应该总是最后定义的。
来自KO 3.0 routing doc:
了解路线在订单中是否匹配非常重要 它们被添加,一旦URL匹配路由,路由就是 基本上“停止”,其余路线从未尝试过。 因为默认路由几乎匹配任何内容,包括空 url,新路线必须放在它之前。
根据建议,交换路线将解决问题。
// This the route for the localizations:
Route::set('locale', '(<locale>(/<controller>(/<action>(/<overflow>))))', array('overflow' => '.*?'))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
// This is my default route:
Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' => '.*?'))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));