PHP 语言检测

php
2022-08-30 17:31:44

我正在尝试构建多语言网站。

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

我不知道它从哪里得到它:

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');

它适用于我,包括波兰语 lang 文件。但是这个代码准确吗?还是有其他方法?


答案 1

浏览器通常会发送一个 HTTP 标头,名称 Accept-Language,指示用户愿意获取的语言。

例如,此标头可以是:

Accept-Language: en-us,en;q=0.5

其中有优先级的概念,顺便说一句;-)

在PHP中,您可以在超级全局中得到这个:$_SERVER

var_dump($_SERVER['HTTP_ACCEPT_LANGUAGE']);

会得到我 :

string 'en-us,en;q=0.5' (length=14)

现在,你必须解析它;-)


如果我在浏览器的选项中编辑我的首选项,说“我想要法语,如果你不能为我提供法语,请从美国给我英语;如果你也拿不懂我,就给我英语吧),标题将是:
Accept-Language: fr-fr,en-us;q=0.7,en;q=0.3

而且,从 PHP :

string 'fr-fr,en-us;q=0.7,en;q=0.3' (length=26)

有关更多信息,您可以查看 [HTTP RFC 的第 14.4 节][1]。

你可能可以在PHP中找到很多代码示例来解析该标头;例如:解析接受语言以检测用户的语言

玩得愉快!


答案 2

这是我用于双语网站的脚本。它将用作 的。根据用户浏览器的语言首选项,如果用户首选语言中的站点不可用,它将重定向到站点的所需语言版本或默认语言站点。index.phpmysite.com

<?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]);
?>

推荐