首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP语言检测

PHP语言检测
EN

Stack Overflow用户
提问于 2009-08-29 18:58:09
回答 8查看 33.9K关注 0票数 24

我正在尝试建立多语言站点。

我使用这段代码来检测用户的语言。如果您尚未选择语言,它将包含基于HTTP_ACCEPT_LANGUAGE的语言文件。

我不知道它是从哪里来的:

代码语言:javascript
复制
session_start();

if (!isset($_SESSION['lang'])) {
   $_SESSION['lang'] = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
}

elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'en') $_SESSION['lang'] = "en";
elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'sv') $_SESSION['lang'] = "sv";
elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'pl') $_SESSION['lang'] = "pl";
elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'fr') $_SESSION['lang'] = "fr";

include('languages/'.$_SESSION['lang'].'.php');

它适用于我,并且包含了波兰语文件。但是这段代码准确吗?还是有别的办法?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-08-29 19:01:17

浏览器通常发送一个HTTP标头,名称为Accept-Language,它指示用户希望使用哪种语言。

例如,此标头可以是:

代码语言:javascript
复制
Accept-Language: en-us,en;q=0.5

这里面有优先级的概念,顺便说一句;-)

在PHP中,你可以在$_SERVER超级全局:

代码语言:javascript
复制
var_dump($_SERVER['HTTP_ACCEPT_LANGUAGE']);

会让我:

代码语言:javascript
复制
string 'en-us,en;q=0.5' (length=14)

现在,您必须对其进行解析;-)

如果我在浏览器的选项中编辑我的首选项,说“我想要法语,如果你不能为我提供法语,就从美国给我英语;如果你也不能给我这个,就给我英语),标题将是:

代码语言:javascript
复制
Accept-Language: fr-fr,en-us;q=0.7,en;q=0.3

并且,来自PHP:

代码语言:javascript
复制
string 'fr-fr,en-us;q=0.7,en;q=0.3' (length=26)

有关更多信息,您可以查看section 14.4 of the HTTP RFC

您可能会在PHP语言中找到许多解析该头文件的代码示例;例如:Parse Accept-Language to detect a user's language

祝你玩得开心!

票数 38
EN

Stack Overflow用户

发布于 2009-08-29 19:18:42

这是我在一个双语网站上使用的脚本。它将用作mysite.comindex.php。根据用户浏览器的语言偏好,如果用户首选语言中的站点不可用,它将重定向到所需的站点语言版本或默认语言站点。

代码语言:javascript
复制
<?php
// List of available localized versions as 'lang code' => 'url' map
$sites = array(
    "en" => "http://en.mysite.com/",
    "bn" => "http://bn.mysite.com/",
);

// Get 2 char lang code
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

// Set default language if a `$lang` version of site is not available
if (!in_array($lang, array_keys($sites)))
    $lang = 'en';

// Finally redirect to desired location
header('Location: ' . $sites[$lang]);
?>
票数 9
EN

Stack Overflow用户

发布于 2015-11-17 11:39:23

我知道已经有很多好的解决方案,但我已经找到了自己的方法来解决这个问题。

代码语言:javascript
复制
<?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
    */

代码会将HTTP_ACCEPT_LANGUAGE字符串转换为以区域设置为键、以权重为值的数组,从高到低排序。因此,您可以使用array_shift逐个获取,以获得与您的站点区域设置最佳匹配。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1352130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档