Skip to content

Instantly share code, notes, and snippets.

@tillsanders
Last active August 29, 2015 14:03
Show Gist options
  • Save tillsanders/4307ee4666a309ac0258 to your computer and use it in GitHub Desktop.
Save tillsanders/4307ee4666a309ac0258 to your computer and use it in GitHub Desktop.
Language url prefix for Laravel 4

Language url prefix for Laravel 4

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment