我在这里看看你设置基于语言环境的路由的方式,因为Session::get('urilang)
没有在你第一次访问时设置,因此错误,并且只有在你去过某个页面后才会设置第一。
现在,我还没有处理多语言网站,但据我所知,你这样做的方式不是正确的方式。相反,将lang键作为URI参数来考虑,并使用过滤器来验证并设置路由。东西有点像下面的代码:
// Main and subpage - not default language
Route::group(array('prefix' => '{lang}', 'before' => 'detectLanguage'), function() {
Route::get('', '[email protected]');
Route::get('{slug}', '[email protected]');
});
// Main and subpage - default language
Route::group(array('before' => 'setDefaultLanguage'), function() {
Route::get('/', '[email protected]');
Route::get('/{slug}', '[email protected]');
});
Route::filter('detectLanguage', function($route, $request, $response, $value){
// hopefully we could do something here with our named route parameter "lang" - not really on sure the details though
// set default
$locale = 'hu';
$lang = '';
// The 'en' -> would come from db and if there is more i would of corse use in array
if (Request::segment(1) == 'en')
{
$lang = 'en';
$locale = 'en';
}
App::setLocale($locale);
Session::put('uriLang', $lang);
Session::put('locale', $locale);
});
Route::filter('setDefaultLanguage', function($route, $request, $response, $value){
App::setLocale('hu');
Session::put('uriLang', '');
Session::put('locale', 'hu');
});
我不知道你是否能在Route::group
前缀使用段变量,但你肯定应该有一搏,因为它会是最有用的。
也就是说,我不建议设置模仿特定语言路线但没有语言段的默认语言路线。如果我是你,我会设置一个特殊的根路由,重定向到/{defaultlang}/
,这样你的路由问题就会减少。
感谢您的帮助,您的代码看起来非常酷,但我只有一个问题。除了domain.com/en/foo以外的所有内容都可以使用因为那里的PublicPageController认为slug是“en”。任何想法?哦,我要编辑代码,因为有一些错别字 –
解决了它,但它并不是那么干净,我同意你的一切,谢谢你的帮助人,真的拯救了我的一天。 –
为编辑而欢呼,我想我有点匆忙,一个出来,对不起。关于路线冲突的事情的好问题。如果我是诚实的,我不确定这个问题的确切方法(尽管据我了解,在另一条路线上注册的路线与相同的URI相匹配会覆盖它,所以你可以考虑在这里逆转订单,但我认为这会给你带来另一个问题)。所以,这就是为什么我建议(在答案的最后)没有双路由系统 - 获得一个系统并坚持下去,因为它使事情变得不那么疯狂了。 – alexrussell