PHP language detection

前端 未结 9 2234
陌清茗
陌清茗 2020-12-14 16:32

I\'m trying to build multilangual site.

I use this piece of code to detect users language. If you havent chosen a language, it will include your language file based

相关标签:
9条回答
  • 2020-12-14 17:13

    You can use: Locale::acceptFromHttp().

    Tries to find locale that can satisfy the language list that is requested by the HTTP "Accept-Language" header.

    0 讨论(0)
  • 2020-12-14 17:14

    Your code looks just fine. You might want to add a final else default choice if the visitor asks for a language you aren't providing. Also, if the visitor himself selects a language you should save that choice in a persistent cookie and check its value, giving it precedence over HTTP_ACCEPT_LANGUAGE.

    As far as I can tell Youtube does use HTTP_ACCEPT_LANGUAGE, but at the same time uses IP geolocation to suggest a change in language if the langauge of the visitor's country doesn't match that. Definitely annoying.

    Just nitpicking: if you're gonna add languages to the list a switch() statement might be more readable.

    0 讨论(0)
  • 2020-12-14 17:15

    Here's a function for selecting the best out of a group of supported languages. It extracts languages from Accept-Language, then sorts the given array of languages according to their priority.

    function select_best_language($languages) {
        if (!$_SERVER['HTTP_ACCEPT_LANGUAGE']) return $languages[0];
        $default_q=100;
        foreach (explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']) as $lqpair) {
            $lq=explode(";q=",$lqpair);
            if ($lq[1]) $lq[1]=floatval($lq[1]); else $lq[1]=$default_q--;
            $larr[$lq[0]]=$lq[1];
        }
        usort($languages,function($a,$b) use ($larr) { return $larr[$b]<=>$larr[$a]; });
        return $languages[0];
    }
    
    $lang = select_best_language(['en','fr','it']);
    
    0 讨论(0)
  • 2020-12-14 17:20

    This is also possible. It will use english as default if .php is not available.

    $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
    (@include_once 'languages/'.$lang.'.php') or (@include_once 'languages/en.php'); 
    
    0 讨论(0)
  • 2020-12-14 17:21
    if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
        $parts=explode(';',$_SERVER['HTTP_ACCEPT_LANGUAGE']);
        $langs=explode(',',$parts[0]);
        var_dump($langs);
    }
    
    0 讨论(0)
  • 2020-12-14 17:23

    I know there already many good solutions, but have found my own way to solve this problem.

    <?php
      $prefLocales = array_reduce(
        explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']), 
          function ($res, $el) { 
            list($l, $q) = array_merge(explode(';q=', $el), [1]); 
            $res[$l] = (float) $q; 
            return $res; 
          }, []);
        arsort($prefLocales);
        /*
        This get you from headers like this
          string 'en-US,en;q=0.8,uk;q=0.6,ru;q=0.4' (length=32)
        array like this
        array (size=4)
          'en-US' => float 1
          'en' => float 0.8
          'uk' => float 0.6
          'ru' => float 0.4
        */
    

    Code will convert HTTP_ACCEPT_LANGUAGE string to array with locales as keys and weight as values, sorted from high value to low. So you can just get one by one with array_shift to get the best match with your site locales.

    0 讨论(0)
提交回复
热议问题