Laravel - первый сегмент будет необязательным

Я новичок в Laravel и хочу, чтобы мой сайт был многоязычным. И я сохраняю выбранный язык slug в Session. Но как я могу сделать так, чтобы мои URL-адреса отображали выбранный язык:

Route::get('/{lang?}/signup', array(
    'as' => 'signup',
    'uses' => 'UsersController@getSignup'
));

http://example.com/en/signup — если я получу первый сегмент с URL::segment (1) и передать его Session все в порядке. С Route, который я разместил выше, я получаю 4oh4, если открываю вторую ссылку.

В общем, я не могу придумать способ, который сделает оба http://example.com/en/signup и http://example.com/singup.

Первая ссылка должна изменить язык пользователя, а вторая должна использовать значение, хранящееся в Session, для получения результатов для этого языка.

Изменить:

Я пытаюсь сделать что-то вроде CMS, где я установил некоторые ключи в таблице в базе данных - languages:

id - (int) AI, name - (varchar) - название языка, prefix - (varchar) - префикс языка

И еще одна таблица, в которой хранятся translations определенных частей веб-сайта: id - (int) AI, key (например, signup_form_name), value (например, моя форма регистрации)

И у меня есть эта функция в моем helpers.php:

function _t($key, $language = NULL)
{
    if(is_null($language))
        $language = Session::get('currLang');
    $string = DB::table('translations')
        ->where('key', $key)
        ->pluck('value');
    return (!is_null($string)) ? $string : $key;
}

person Ivanka Todorova    schedule 13.08.2014    source источник
comment
Я не думаю, что наличие двух URL-адресов, указывающих на один и тот же контент, — это хорошо (/en/singup и /singup). Я бы перенаправил на сохраненный язык в Session. И сделайте так, чтобы в первом сегменте всегда был код языка. Вы можете сравнить первый сегмент с массивом, содержащим список всех кодов языков, которые вы ожидаете.   -  person azeós    schedule 13.08.2014
comment
@azeós, спасибо за ответ. Я обновил свой вопрос с подробной информацией. Я не использую Locale в Laravel.   -  person Ivanka Todorova    schedule 13.08.2014


Ответы (2)


Как это могло отличить

en

от

signup

?

Это всего лишь две струны. Единственный способ может состоять в том, чтобы ударить

http://example.com//signup

Вместо

http://example.com/signup 

Потому что таким образом вы явно сообщаете Laravel, что не передаете первый параметр маршрута. Но это не сработает, потому что Laravel тоже этого не поймет, на Github есть проблема по этому поводу.

Итак, это один из ваших вариантов:

Route::get('/signup/{lang?}' ...);

Таким образом, вы можете ударить его как

http://example.com/signup

or

http://example.com/signup/en
person Antonio Carlos Ribeiro    schedule 13.08.2014

Route::get('/{lang?}/signup', array(
    'as' => 'signup',
    'uses' => 'UsersController@getSignup'
))->where('lang', '(en|br)');

Ключевая проблема здесь в том, что вам нужно жестко закодировать языки в свой контроллер, но это должно работать...

person aamuller    schedule 30.04.2018