изменение URL и локали на лету с laravel

Мой код в laravel для обработки нескольких языков:

$languages = array('it-IT','en-GB','fr-FR');
    $lingua = Request::segment(1);
    if(in_array($lingua, $languages)){
        \App::setLocale($lingua);
    }else{
        $lingua = 'it-IT';
    }


Route::group(array('prefix' => $lingua), function()
{

    Route::get('/', array('as' => 'home', 'uses' => 'ItemController@menu'));
    Route::get('/{idcampo}','ItemController@show');
});

Как я могу:

1) Сделайте так, чтобы страница всегда начиналась с it-IT по умолчанию. (мне это нужно, потому что я использую $lingua для извлечения из базы данных), поэтому у меня не может быть этого нуля. Должен ли я использовать redirect::to/to/it-IT?

2) измените URL-адрес и язык (приложение: локаль) на лету со ссылкой в ​​верхней части каждой страницы. не возвращаясь домой.

3) для ссылок на страницы я учусь использовать: URL::route('home') но как это сделать когда ссылка меняется при входе в базу данных (например моя ссылка {{ URL::to($lingua. '/'. $campo[1].'/') }}) мне нужно использовать URL::action('ItemController@show', ($lingua. '/'. $campo[1].'/'))

РЕДАКТИРОВАТЬ:

ОК, в верхней части моих страниц есть ссылка для смены языка на лету.

<a href="{{URL::action('LanguageController@select', 'it-IT')}}"> Italian </a> //
<a href="{{URL::action('LanguageController@select', 'en-GB')}}"> English </a> // 
<a href="{{URL::action('LanguageController@select', 'fr-FR')}}"> French </a>

Я создаю контроллер с именем LanguageController.

<?php

class LanguageController extends BaseController {

    public function select($lingua)

    {
         // Store the current language in the session
    Session::put('lingua', $lingua);

    return Redirect::back(); // redirect to the same page, nothing changes, just the language                           

    }
}

Я создаю маршрут:

  Route::get('lingua/{lingua}', 'LanguageController@select');
    Route::get('/', array('as' => 'home', 'uses' => 'ItemController@menu'));
    Route::get('/mondo/','ItemController@mondo');
    Route::get('/{idcampo}','ItemController@show');

У меня есть свой ItemController@menu

public function menu()

{   $linguadefault='it-IT';
    $lingua = Session::get('lingua',$linguadefault);
    $data = DB::table('campo')->lists('id');
    return View::make('index')->with('campo',$data)->with('lingua',$lingua);


}

1) Я не понимаю, зачем мне нужно маршрутизировать на lingua/{lingua}, если я никогда не маршрутизирую туда, но я использую url: action для контроллера напрямую.

2) теперь мне нужно добавить

$linguadefault='it-IT';
        $lingua = Session::get('lingua',$linguadefault);

в начале каждой функции иметь языковую переменную на моей странице, верно?

3) теперь мой язык застрял на французском, и я больше не могу его изменить.


person user3384514    schedule 20.03.2014    source источник


Ответы (1)


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

1) Используйте сеанс, чтобы сохранить выбранный язык:

// Set the default language to the current user language
// If user is not logged, defaults to Italian
$linguaDefault = Auth::check()
                 ? Auth::user()->lingua
                 : 'it-IT';

/// If not stored in Session, current language will be the default one
\App::setLocale(Session::get('lingua', $linguaDefault));

Чтобы язык всегда устанавливался в вашем приложении, вы можете поместить этот код в свой файл

app/start/global.php

И вам не нужно добавлять это куда-либо еще. Таким образом, он будет использовать его в следующем порядке:

a) Language stored in Session (selected online)
b) Language user has in database
c) Italian

2) Чтобы изменить язык, на котором вы создаете маршрут:

Route::get('lingua/{lang}', 'LanguageController@select');

Ваши ссылки

URL::action('LanguageController@select', 'it-IT')
URL::action('LanguageController@select', 'en-GB')
URL::action('LanguageController@select', 'fr-FR');

И в вашем контроллере вам просто нужно сделать:

public function select($lang)
{
    // Store the current language in the session
    Session::put('lingua', $lang);

    return Redirect::back(); // redirect to the same page, nothing changes, just the language
}

3) Таким образом, вам не нужен ваш язык во всех ваших URL-адресах, вам не нужно иметь дело с ним во всех ваших маршрутах. Если ваш пользователь меняет язык в базе данных, вы просто:

$user->save();
Session::put('lingua', $user->lingua);
return Redirect::route('home'); // or anything else
person Antonio Carlos Ribeiro    schedule 21.03.2014
comment
Большое спасибо за ваш ответ, но на моем сайте нет пользователя, я имею в виду, что ему просто нужно получить описание из базы данных в соответствии с текущим языком. Я подумал указать язык в URL-адресе, потому что я видел, что на многих веб-сайтах есть url/nl или url/en или url/it на их веб-страницах. - person user3384514; 21.03.2014
comment
Да, но мне нравятся чистые URL-адреса... И вам не нужно, чтобы языки работали нормально, попробуйте. - person Antonio Carlos Ribeiro; 21.03.2014
comment
Я пытаюсь использовать это, но я немного запутался в сеансе. Я имею в виду, мой язык не меняется сейчас - person user3384514; 21.03.2014
comment
Не могли бы вы вставить свой код, чтобы я мог попытаться вам помочь? - person Antonio Carlos Ribeiro; 21.03.2014
comment
Кажется, что застрял на французском языке - person user3384514; 21.03.2014
comment
ссылка работает: когда я вижу источник localhost/Project/public/lingua/it-IT Мне не следует ставить что-то вроде App:setLocale? где-то изменить локаль - person user3384514; 21.03.2014
comment
Насчет вашего 2) поместите код в ваш app/start/global.php. - person Antonio Carlos Ribeiro; 21.03.2014
comment
Да, я проверяю dd($lingua) и язык меняется, может быть, мне просто нужно добавить App:setLocale($lingua) где-нибудь, чтобы изменить локаль - person user3384514; 21.03.2014
comment
О 1), маршрут lingua/{lingua} предназначен только для того, чтобы ваш пользователь мог выбрать язык, он больше ничего не делает. - person Antonio Carlos Ribeiro; 21.03.2014
comment
Помещение этих двух строк в ваш app/start/global.php должно заставить его работать каждый раз. Также для отладки можно сделать так: laravel.io/bin/4l6L - person Antonio Carlos Ribeiro; 21.03.2014
comment
Большое спасибо! теперь мне не нужно сходить с ума от языка в URL-адресе, и ваше решение чище, я должен это признать. Кстати, помещая вещи в app/start/global.php, у меня есть переменная $lingua, всегда доступная везде? - person user3384514; 21.03.2014
comment
Похоже, что для использования переменной $lingua на страницах мне нужно поставить $linguadefault='it-IT'; $lingua = Session::get('lingua',$linguadefault); в начале каждой функции контроллера это нормально, верно? - person user3384514; 21.03.2014
comment
Здесь добавлены еще две строки, чтобы показать, как получить язык везде: laravel.io/bin/9K6W - person Antonio Carlos Ribeiro; 21.03.2014
comment
Вам больше не нужно значение по умолчанию в вашем контроллере, оно устанавливается в вашем файле global.php. - person Antonio Carlos Ribeiro; 21.03.2014
comment
Зачем вам это нужно в ваших контроллерах? Что ты пытаешься сделать? - person Antonio Carlos Ribeiro; 21.03.2014
comment
Мне нужно использовать язык $lingua в запросе, чтобы получить правильное описание элемента. - person user3384514; 21.03.2014