From c091dacfc292d65b7709ec8cc9cc365b1cb82a2e Mon Sep 17 00:00:00 2001 From: Sebastien Guibert Date: Sun, 26 Jun 2011 19:09:00 +0200 Subject: [PATCH] Final version 2.0 --- classes/multilang/core.php | 39 ++++++++++++++++++++++++----------- classes/multilang/request.php | 17 +++++++++++---- classes/multilang/route.php | 14 +++++++++++++ classes/multilang/routes.php | 19 ++++++----------- 4 files changed, 60 insertions(+), 29 deletions(-) diff --git a/classes/multilang/core.php b/classes/multilang/core.php index 49ce895..6cd7ac4 100644 --- a/classes/multilang/core.php +++ b/classes/multilang/core.php @@ -99,39 +99,54 @@ class Multilang_Core { } // Create uris for each language - foreach($languages as $code => &$language) + foreach($languages as $lang => &$language) { // If it's the current language - if($code === Request::$lang) + if($lang === Request::$lang) { // We only display it when required if($current) { - $selectors[$code] = ''.$languages[$code]['label'].''; + $selectors[$lang] = ''.$languages[$lang]['label'].''; } } else { + $route = NULL; + // If it's the default route, it's unique and special (like you <3) if($current_route === 'default') { // We juste need to change the language parameter - $route = Request::initial()->route(); - $params = array( - 'lang' => $code, - ); + $route = Request::initial()->route(); + + if(!Kohana::config('multilang.hide_default') || Kohana::config('multilang.default') !== $lang) + { + $params['lang'] = $lang; + } + } else - { - $route = Route::get($name, $code); + { + if(Arr::get(Route::all(), $lang.'.'.$name)) + { + $route = Route::get($name, $lang); + } } - $selectors[$code] = HTML::anchor($route->uri($params), $languages[$code]['label'], array('class' => 'multilang-selectable multilang-'.$code, 'title' => $languages[$code]['label'])); + if($route !== NULL) + { + $selectors[$lang] = HTML::anchor($route->uri($params), $languages[$lang]['label'], array('class' => 'multilang-selectable multilang-'.$lang, 'title' => $languages[$lang]['label'])); + } } } - - return View::factory('multilang/selector') + // We display the menu only if we can select another language for this page + if(count($selectors) > 1) + { + return View::factory('multilang/selector') ->bind('selectors', $selectors); + } + return ''; } } \ No newline at end of file diff --git a/classes/multilang/request.php b/classes/multilang/request.php index 9bf600b..298aa90 100644 --- a/classes/multilang/request.php +++ b/classes/multilang/request.php @@ -31,7 +31,7 @@ class Multilang_Request extends Kohana_Request { if(!Kohana::$is_cli) { // If we don't hide the default language, we must look for a language code for the root uri - if(!Kohana::config('multilang.hide_default') && $uri === TRUE && Request::detect_uri() === '') + if(Kohana::config('multilang.auto_detect') && $uri === TRUE && Request::detect_uri() === '') { $lang = Multilang::find_user_language(); @@ -40,14 +40,23 @@ class Multilang_Request extends Kohana_Request { // Redirect to the root URI, but with language prepended header($protocol.' 302 Found'); - header('Location: '.URL::base(TRUE, TRUE).$lang.'/'); - + header('Location: '.URL::base(TRUE, TRUE).$lang.'/'); exit; } } $request = parent::factory($uri, $cache, $injected_routes); - Request::$lang = $request->param('lang'); + + // If the default language is hidden, we manually set it + if(Kohana::config('multilang.hide_default') && $request->param('lang') === NULL) + { + Request::$lang = Kohana::config('multilang.default'); + } + else + { + Request::$lang = $request->param('lang'); + } + Multilang::init(); return $request; } diff --git a/classes/multilang/route.php b/classes/multilang/route.php index 1957573..61b5573 100644 --- a/classes/multilang/route.php +++ b/classes/multilang/route.php @@ -18,6 +18,20 @@ class Multilang_Route extends Kohana_Route { */ static public function set($name, $uri_callback = NULL, $regex = NULL, $lang = NULL) { + if(!Kohana::config('multilang.hide_default') || Kohana::config('multilang.default') != $lang) + { + if($lang !== NULL) + { + $uri_callback = '/'.$uri_callback; + $regex['lang'] = $lang; + } + } + + if($lang !== NULL) + { + $name = $lang.'.'.$name; + } + return Route::$_routes[$name] = new Route($uri_callback, $regex, $lang); } diff --git a/classes/multilang/routes.php b/classes/multilang/routes.php index 6d75a18..4efd384 100644 --- a/classes/multilang/routes.php +++ b/classes/multilang/routes.php @@ -33,33 +33,26 @@ class Multilang_Routes { $default_lang = Kohana::config('multilang.default'); $languages = Kohana::config('multilang.languages'); + // We first look for the default language uri which is obviously compulsory $default_uri = Arr::get($uris, $default_lang); if($default_uri === NULL) { - throw new Kohana_Exception('The default route uri is required for the language :lang', array(':lang' => $default_lang)); + throw new Kohana_Exception('The default language route uri is required for the route: :route', array(':route' => $name)); } else - { - // If we dont hide the default language in the uri - if(!Kohana::config('multilang.hide_default')) - { - $default_uri = '/'.$default_uri; - $regex['lang'] = $default_lang; - } - $routes->_routes[$default_lang.'.'.$name] = Route::set($default_lang.'.'.$name, $default_uri, $regex, $default_lang); - + { + $routes->_routes[$default_lang.'.'.$name] = Route::set($name, $default_uri, $regex, $default_lang); } unset($languages[$default_lang]); // Then we add the routes for all the other languages foreach($languages as $lang => $settings) { - $uri = '/'.(Arr::get($uris, $lang) ? $uris[$lang] : $uris[$default_lang]); - $regex['lang'] = $lang; + $uri = (Arr::get($uris, $lang) ? $uris[$lang] : $uris[$default_lang]); // For the uri, we use the one given or the default one - $routes->_routes[$lang.'.'.$name] = Route::set($lang.'.'.$name, $uri, $regex, $lang); + $routes->_routes[$lang.'.'.$name] = Route::set($name, $uri, $regex, $lang); } return $routes; }