使用laravel更改URL和运行中的区域设置

时间:2014-03-20 22:34:35

标签: laravel laravel-4

我在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为默认值。 (我需要它,因为我使用$ lingua从数据库中获取)所以我不能有那个null。我应该使用重定向:: to / to / it-IT吗?

2)在他飞行时更改网址和语言(app:locale),每个页面的上半部分都有一个链接。没有回到家里。

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>

我创建了一个控制器clled 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)现在我的语言似乎被法语所困扰,我再也无法改变它了。

1 个答案:

答案 0 :(得分:2)

我不会一直使用URL中的语言,您只需在需要时切换语言并保留它:

1)使用Session来保留所选语言:

// 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)这样您就不需要在所有网址中使用自己的语言,也不必在所有路由中处理它。如果您的用户更改了数据库中的语言,您只需:

$user->save();
Session::put('lingua', $user->lingua);
return Redirect::route('home'); // or anything else