I approached this once when building a webshop system with Laravel.
- Set your default and fallback locale in app/config/app.php
- Set the 'languages' array to your chosen languages, e.g.
'languages' => ['en' => 'English', 'de' => 'Deutsch']for my app - Set up a route to switch languages in routes.php:
Route::get('switchLanguage/{lang}', ['uses' => 'ShopController'@switchLanguage', 'as' => 'switchLanguage']);
- In my controller method I set a global Session variable with the chosen language
/**
* @param String $lang
* @return mixed
*/
public function switchLanguage($lang)
{
Session::put('language', $lang);
return Redirect::back();
}
- Then I implemented a route filter to set the language:
Route::before(function()
{
// Set default session language if none is set
if(!Session::has('language'))
{
// detect browser language
$headerlang = Request::server('http_accept_language');
if(isset($headerlang))
{
$headerlang = substr(Request::server('http_accept_language'), 0, 2);
if(array_key_exists($headerlang, Config::get('app.languages')))
{
// browser lang is supported, use it
$lang = $headerlang;
}
// use default application lang
else
{
$lang = Config::get('app.locale');
}
}
// use default
else
{
// use default application lang
$lang = Config::get('app.locale');
}
// set application language for that user
Session::put('language', $lang);
App::setLocale(Session::get('language'));
}
// session is available
else
{
// set application to session lang
App::setLocale(Session::get('language'));
}
});
Now you just have to set up the corresponding language files in app/lang/{$lang} and translate all your strings (I made one file per module/section for my app). Whenever you echo out anything predefined in one of your views, you use Laravel's Lang Facade to get the correct string. E.g. {{ Lang::get('admin.settings') }} to show the translated string for "Settings".