diff --git a/application/config/application.php b/application/config/application.php index 525227c2..60735a60 100755 --- a/application/config/application.php +++ b/application/config/application.php @@ -94,6 +94,19 @@ 'language' => 'en', + /* + |-------------------------------------------------------------------------- + | Supported Languages + |-------------------------------------------------------------------------- + | + | These languages may also be supported by your application. If a request + | enters your application with a URI beginning with one of these values + | the default language will automatically be set to that language. + | + */ + + 'languages' => array(), + /* |-------------------------------------------------------------------------- | SSL Link Generation diff --git a/laravel/laravel.php b/laravel/laravel.php index e1c2ba32..74c387f9 100644 --- a/laravel/laravel.php +++ b/laravel/laravel.php @@ -107,6 +107,48 @@ return Event::first('404'); }); +/* +|-------------------------------------------------------------------------- +| Gather The URI And Locales +|-------------------------------------------------------------------------- +| +| When routing, we'll need to grab the URI and the supported locales for +| the route so we can properly set the language and route the request +| to the proper end-point in the application. +| +*/ + +$uri = URI::current(); + +$languages = Config::get('application.languages', array()); + +$languages[] = Config::get('application.language'); + +/* +|-------------------------------------------------------------------------- +| Set The Locale Based On The Route +|-------------------------------------------------------------------------- +| +| If the URI starts with one of the supported languages, we will set +| the default lagnauge to match that URI segment and shorten the +| URI we'll pass to the router to not include the lang segment. +| +*/ + +foreach ($languages as $language) +{ + if (starts_with($uri, $language)) + { + Config::set('application.language', $language); + + $uri = trim(substr($uri, strlen($language)), '/'); break; + } +} + +if ($uri == '') $uri = '/'; + +URI::$uri = $uri; + /* |-------------------------------------------------------------------------- | Route The Incoming Request @@ -118,8 +160,6 @@ | */ -$uri = URI::current(); - Request::$route = Routing\Router::route(Request::method(), $uri); $response = Request::$route->call(); diff --git a/laravel/url.php b/laravel/url.php index 4ff0f474..b85dbc70 100644 --- a/laravel/url.php +++ b/laravel/url.php @@ -26,7 +26,7 @@ public static function full() */ public static function current() { - return static::to(URI::current()); + return static::to(URI::current(), null, false, false); } /** @@ -89,9 +89,11 @@ public static function base() * * @param string $url * @param bool $https + * @param bool $asset + * @param bool $locale * @return string */ - public static function to($url = '', $https = null) + public static function to($url = '', $https = null, $asset = false, $locale = true) { // If the given URL is already valid or begins with a hash, we'll just return // the URL unchanged since it is already well formed. Otherwise we will add @@ -105,7 +107,17 @@ public static function to($url = '', $https = null) // security for any new links generated. So https for all secure links. if (is_null($https)) $https = Request::secure(); - $root = static::base().'/'.Config::get('application.index'); + $root = static::base(); + + if ( ! $asset) + { + $root .= '/'.Config::get('application.index'); + } + + if ( ! $asset and $locale and count(Config::get('application.languages')) > 0) + { + $root .= '/'.Config::get('application.language'); + } // Since SSL is not often used while developing the application, we allow the // developer to disable SSL on all framework generated links to make it more @@ -232,7 +244,7 @@ public static function to_asset($url, $https = null) return rtrim($root, '/').'/'.ltrim($url, '/'); } - $url = static::to($url, $https); + $url = static::to($url, $https, true); // Since assets are not served by Laravel, we do not need to come through // the front controller. So, we'll remove the application index specified