File: D:/HostingSpaces/SBogers33/broosensterck.nl/app/Komma/LanguageService.php
<?php
namespace Komma;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Session;
class LanguageService
{
/*
* Array available languages
* [languageId => languageSlug]
*/
protected $availableLanguages;
/*
* String default language slug
*/
protected $defaultLanguage;
/*
* String current language slug
*/
protected $currentLanguage;
public function setLanguage()
{
//if root check the accept language for language indication if isset
if($this->useAcceptLanguage()) $this->setLanguageByAcceptLanguage();
else $this->setLanguageBySession();
}
public function setLanguageBySession()
{
$this->availableLanguages = \Config::get('app.availableLanguages');
$this->defaultLanguage = \Config::get('app.locale');
$this->currentLanguage = Session::get('lang', $this->defaultLanguage);
\App::setLocale($this->currentLanguage);
}
public function setLanguageByAcceptLanguage()
{
//convert accept language to language array ordered on preference
$langArray = $this->convertAcceptLanguage($_SERVER["HTTP_ACCEPT_LANGUAGE"]);
//Loop trough the array a preferred language
foreach (array_keys($langArray) as $lang)
{
//check if it is in available languages
foreach (\Config::get('app.availableLanguages') as $availableLanguage){
//if there is a match, set language and return
if (strpos($lang, $availableLanguage) === 0) {
$this->currentLanguage = $availableLanguage;
Session::set('lang', $availableLanguage);
return;
}
}
}
}
/*
* Set Current Language by URI
*/
public function setCurrentLanguage($lang)
{
$this->setLanguage();
if( ! in_array($lang, $this->availableLanguages)) echo 'error in set Language';
$this->currentLanguage = $lang;
Session::set('lang', $lang);
\App::setLocale($lang);
}
/**
* Check if current route is correct with set language
*/
public function checkRouteWithSetLanguage()
{
$segments = \Request::segments();
if(sizeof($segments) > 0)
{
$lang = \DB::table('languages')
->where('iso_2', '=', $segments[0])
->first();
if($lang != null) $this->setCurrentLanguage($lang->iso_2);
}
}
public function getCurrentLanguageId()
{
$lang = $this->getLangByIso(\App::getLocale());
return $lang->id;
}
public function getCurrentLanguageIso()
{
$lang = $this->getLangByIso(\App::getLocale());
return $lang->iso_2;
}
public function getLangByIso($langIso)
{
return \DB::table('languages')
->where('iso_2', '=', $langIso)
->first();
}
public function getIsoById($id)
{
return \DB::table('languages')
->where('id', '=', $id)
->first();
}
/**
* Check if we should use the Accept Language
* @return bool
*/
private function useAcceptLanguage()
{
// Only use on root
if( ! sizeof(\Request::segments()) == 0) return false;
// No Accept Language available
if( ! isset($_SERVER["HTTP_ACCEPT_LANGUAGE"]) ) return false;
// No Session found
if(\Session::has('lang')) return false;
return true;
}
/**
* Encode accept language header
* http://www.thefutureoftheweb.com/blog/use-accept-language-header
*
* @param $serverString
* @return array
*/
private function convertAcceptLanguage($serverString)
{
$langs = array();
// break up string into pieces (languages and q factors)
preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $serverString, $lang_parse);
if(count($lang_parse[1]))
{
// create a list like "en" => 0.8
$langs = array_combine($lang_parse[1], $lang_parse[4]);
// set default to 1 for any without q factor
foreach ($langs as $lang => $val)
{
if($val === '') $langs[$lang] = 1;
}
// sort list based on value
arsort($langs, SORT_NUMERIC);
}
return $langs;
}
}