【问题标题】:How to use Locale::lookup with locale from $_SERVER['HTTP_ACCEPT_LANGUAGE']?如何将 Locale::lookup 与 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 的语言环境一起使用?
【发布时间】:2015-05-05 14:07:03
【问题描述】:

我创建了一个函数,它应该根据用户的语言环境返回最佳翻译。

输入是多个语言的相同文本翻译的数组(来自BDD),语言存储为键,如下所示:

$textes = array(2) {
    ["fr-fr"]=> string(24) "Editer l'item" 
    ["en-en"]=> string(22) "Edit the item"
} 

当$textes仅包含一项时,该函数返回该项目,否则它应该返回最佳翻译;我尝试处理 intl 的 Locale 函数,但它总是返回一个空字符串:

private static function getMeilleureTraduction(array $textes) {
    if (count($textes) === 1) {
        return array_pop($textes);
    }

    // Returns "fr,en;q=0.8,fr-fr;q=0.5,en-us;q=0.3"
    $a = $_SERVER['HTTP_ACCEPT_LANGUAGE']; 

    // Returns "fr"
    $b = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);

    // Returns ""
    $c = Locale::lookup(array_keys($textes), $a, true);

    // Returns ""
    $d = Locale::lookup(array_keys($textes), $b, true);

    // return $textes[$bestLocale];
}

所以lookup 函数对我没有帮助,因为它无法做出决定。我用错了吗?或者我不明白php-intl的函数的目的,我应该自己编码?

【问题讨论】:

    标签: php locale


    【解决方案1】:

    终于找到了一个可以工作的函数HERE。

    功能:

    <?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 = isset($_SERVER['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) && ($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) && (($qvalue*0.9) > $bestqval)) { 
                $bestlang = $langprefix; 
                $bestqval = $qvalue*0.9; 
            } 
        } 
        return $bestlang; 
    } 
    ?>
    

    【讨论】:

      猜你喜欢
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 2014-04-16
      相关资源
      最近更新 更多