我在這裏看看你設置基於語言環境的路由的方式,因爲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