การเปลี่ยน 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 เพื่อดึงข้อมูลจากฐานข้อมูล) ดังนั้นฉันจึงไม่มีค่าว่างนั้น ฉันควรใช้การเปลี่ยนเส้นทาง::to / to /it-IT หรือไม่

2) เปลี่ยน URL และภาษา (แอป: สถานที่) เมื่อเขาบินพร้อมลิงก์ในส่วนบนของทุกหน้า โดยไม่ได้กลับบ้าน

3) เพื่อเชื่อมโยงเพจที่ฉันเรียนรู้การใช้: URL::route('home') แต่จะทำอย่างไรเมื่อลิงก์เปลี่ยนไปพร้อมกับรายการฐานข้อมูล (เช่น ลิงก์ของฉันคือ {{ URL::to($lingua. '/'. $campo[1].'/') }}) ฉันต้องใช้ URL::action('ItemController@show', ($lingua. '/'. $campo[1].'/'))

แก้ไข:

ตกลงที่ด้านบนของหน้าของฉันมีลิงก์สำหรับเปลี่ยนภาษาได้ทันที

<a href="/th{{URL::action('LanguageController@select', 'it-IT')}}"> Italian </a> //
<a href="/th{{URL::action('LanguageController@select', 'en-GB')}}"> English </a> // 
<a href="/th{{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
การใส่ 2 บรรทัดนั้นใน app/start/global.php ของคุณควรจะทำให้มันใช้งานได้ทุกครั้ง นอกจากนี้ หากต้องการแก้ไขข้อบกพร่อง คุณสามารถทำได้ดังนี้: laravel.io/bin/4l6L - person Antonio Carlos Ribeiro; 21.03.2014
comment
ขอบคุณมาก! ตอนนี้ฉันไม่ต้องคลั่งไคล้ภาษาใน url อีกต่อไปแล้ว และวิธีแก้ปัญหาของคุณก็สะอาดกว่า ฉันต้องยอมรับมัน BTW วางสิ่งต่าง ๆ ใน 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