Not sure, where I got the initial code from :( But this is, what I use at the moment:
Add to app/config/app.php:
<?php
// [...]
'languages' => array('de', 'en'),
Add to app/routes.php:
<?php
// default browser language
$request = Request::instance();
$language = substr($request->server->get('HTTP_ACCEPT_LANGUAGE'), 0, 2);
if(!in_array($language, Config::get('app.languages')))
{
$language = Config::get('app.fallback_locale');
}
// language set from route
if(!is_null($request->segment(1)))
{
$routeLanguage = $request->segment(1);
if(in_array($routeLanguage, Config::get('app.languages'))) {
$language = $routeLanguage;
}
}
// set the language
Config::set('app.locale', $language);
App::setLocale($language);
Route::get('/', function() {
return Redirect::to(Config::get('app.locale'));
});
// Set current lang to be processed last, so it overwrites the named routes
$languages = Config::get('app.languages');
unset($languages[array_search(Config::get('app.locale'), $languages)]);
$languages[] = Config::get('app.locale');
Now, lets abuse route groups to add our routes in multiple languages, shall we?
<?php
// [...]
foreach($languages as $language)
{
Route::group(array('prefix' => $language), function()
{
Route::get('/', array('as' => 'home', function()
{
// return home view
}));
});
}
Now, add a language switch:
@if(Config::has('app.languages') && count(Config::get('app.languages')) > 1)
<ul class="lang">
@foreach(Config::get('app.languages') as $language)
@if($language == Config::get('app.locale'))
<li class="active">{{ HTML::link(URL::current(), $language) }}</li>
@else
@if(Route::currentRouteName() === 'home')
<li>{{ HTML::link(substr_replace(URL::current(), '/'.$language, strpos(URL::current(), '/'.Config::get('app.locale')), 4), $language) }}</li>
@else
<li>{{ HTML::link(substr_replace(URL::current(), '/'.$language.'/', strpos(URL::current(), '/'.Config::get('app.locale').'/'), 4), $language) }}</li>
@endif
@endif
@endforeach
</ul>
@endif