Skip to content

Instantly share code, notes, and snippets.

@ronaldmansveld
Created May 13, 2014 22:50
Show Gist options
  • Select an option

  • Save ronaldmansveld/eebaa553093fec4c68be to your computer and use it in GitHub Desktop.

Select an option

Save ronaldmansveld/eebaa553093fec4c68be to your computer and use it in GitHub Desktop.
Getting default language in PHP
<?php
class LanguageDetector {
static public function parse($sAcceptLanguage) {
$parts = array_map('trim', explode(',', $sAcceptLanguage));
foreach ($parts as &$part) {
$part = explode(';', $part);
$weight = (array_key_exists(1, $part) ? (float) substr($part[1], 2) : 1);
preg_match_all(self::getBCP47RegEx(), $part[0], $part);
foreach (array_keys($part) as $k) {
if(is_int($k)) unset($part[$k]);
else $part[$k] = $part[$k][0];
}
$part['weight'] = $weight;
}
uasort($parts, function($a, $b) {
return ($a['weight'] == $b['weight'] ? 0 : ($a['weight'] < $b['weight'] ? 1 : -1)); // -1 and 1 reversed, since we want to sort DESC, not ASC
});
return $parts;
}
static private function getBCP47RegEx() {
$regular = 'art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang';
$irregular = 'en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE';
$grandfathered = $irregular.'|'.$regular;
$privateuse = 'x(?:-[a-z0-9]{1,8})+';
$singleton = '[a-wy-z0-9]';
$extension = $singleton.'(?:-[a-z0-9]{2,8})+';
$variant = '[a-z0-9]{5,8}|\d[a-z0-9]{3}';
$region = '[a-z]{2}|\d{3}';
$script = '[a-z]{4}';
$extlang = '[a-z]{3}(?:-[a-z]{3}){,2}';
$language = '[a-z]{2,3}(?P<extlang>'.$extlang.')?|[a-z]{4}|[a-z]{5,8}';
$langtag = '(?P<language>'.$language.')'.'(?:-(?P<script>'.$script.'))?'.'(?:-(?P<region>'.$region.'))?'.'(?:-(?P<variant>'.$variant.'))*'.'(?:-(?P<extension>'.$extension.'))*'.'(?:-(?P<privuse>'.$privateuse.'))?';
$languagetag = '(?P<langtag>'.$langtag.')|'.'(?P<privateuse>'.$privateuse.')|'.'(?P<grandfathered>'.$grandfathered.')';
return '#'.$languagetag.'#i';
}
}
?>
<h1>Language request tester</h1>
<h2>In order, the requested languages are:</h2>
<ul>
<?php foreach (LanguageDetector::parse($_SERVER['HTTP_ACCEPT_LANGUAGE']) as $lang) { ?>
<li>Language: <?=$lang['language']?> <?= $lang['region'] ? 'for region '.$lang['region'] : '' ?></li>
<?php } ?>
</ul>
<p>Further information and reading:
<ul>
<li><a href="http://www.w3.org/International/questions/qa-accept-lang-locales" target="_blank">http://www.w3.org/International/questions/qa-accept-lang-locales</a></li>
</ul>
</p>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment