PHP Automatic Language Selection

This code snippets allows you to determine which language out of an available set or based on site languages and user preferences. You might find this very useful as well.
<?php
    /*
      determine which language out of an available set the user prefers most
     
      $available_languages array with language-tag-strings (must be lowercase) that are available
      $http_accept_language a HTTP_ACCEPT_LANGUAGE string (read from $_SERVER['HTTP_ACCEPT_LANGUAGE'] if left out)
    */

    function prefered_language ($available_languages,$http_accept_language="auto") {
    // if $http_accept_language was left out, read it from the HTTP-Header
    if ($http_accept_language == "auto") $http_accept_language = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
     
    // standard for HTTP_ACCEPT_LANGUAGE is defined under
    // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
    // pattern to find is therefore something like this:
    // 1#( language-range [ ";" "q" "=" qvalue ] )
    // where:
    // language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
    // qvalue = ( "0" [ "." 0*3DIGIT ] )
    // | ( "1" [ "." 0*3("0") ] )
    preg_match_all("/([[:alpha:]]{1,8})(-([[:alpha:]|-]{1,8}))?" .
    "(\s*;\s*q\s*=\s*(1\.0{0,3}|0\.\d{0,3}))?\s*(,|$)/i",
    $http_accept_language, $hits, PREG_SET_ORDER);
     
    // default language (in case of no hits) is the first in the array
    $bestlang = $available_languages[0];
    $bestqval = 0;
     
    foreach ($hits as $arr) {
    // read data from the array of this hit
    $langprefix = strtolower ($arr[1]);
    if (!empty($arr[3])) {
    $langrange = strtolower ($arr[3]);
    $language = $langprefix . "-" . $langrange;
    }
    else $language = $langprefix;
    $qvalue = 1.0;
    if (!empty($arr[5])) $qvalue = floatval($arr[5]);
     
    // find q-maximal language
    if (in_array($language,$available_languages) &amp;&amp; ($qvalue > $bestqval)) {
    $bestlang = $language;
    $bestqval = $qvalue;
    }
    // if no direct hit, try the prefix only but decrease q-value by 10% (as http_negotiate_language does)
    else if (in_array($langprefix,$available_languages) &amp;&amp; (($qvalue*0.9) > $bestqval)) {
    $bestlang = $langprefix;
    $bestqval = $qvalue*0.9;
    }
    }
    return $bestlang;
    }
    ?>

All PHP Scripts on this website are rovided by phpscripts4u.com where you can find all the latest PHP code snippets, plugins and libraries.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>