PHP语言检测

22 php

我是一个试图建立他的第一个多语言网站的爱好者

我使用这段代码来检测用户语言.如果您还没有选择一种语言,它将包含基于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');
Run Code Online (Sandbox Code Playgroud)

它适用于我,包括波兰语文件.但这段代码是否准确?还是有另一种方式?您认为YouTube如何做到这一点?

如果一些英国人,法国人,瑞典人或波兰人可以访问我的网站并查看它是否包含正确的文件,那将会很棒!所以我知道它不适合我:) http://jorm.homeftp.org/

无论如何你认为我可以改进我的代码?它会显得凌乱,因为我添加更多语言与所有其他人!

谢谢

Pas*_*TIN 35

浏览器通常发送一个名为Accept-Language的HTTP标头,指示用户愿意获得的语言.

例如,此标头可以是:

Accept-Language: en-us,en;q=0.5
Run Code Online (Sandbox Code Playgroud)

它有优先权的概念,顺便说一句;-)

在PHP中,您可以在$_SERVER超级全局中获得:

var_dump($_SERVER['HTTP_ACCEPT_LANGUAGE']);
Run Code Online (Sandbox Code Playgroud)

会得到我:

string 'en-us,en;q=0.5' (length=14)
Run Code Online (Sandbox Code Playgroud)

现在,你必须解析那个;-)


如果我在浏览器的选项中编辑我的偏好,说"我想要法语,如果你不能为我服务法语,请从美国给我英语;如果你也不能告诉我,那就让我英文),标题将是:

Accept-Language: fr-fr,en-us;q=0.7,en;q=0.3
Run Code Online (Sandbox Code Playgroud)

而且,来自PHP:

string 'fr-fr,en-us;q=0.7,en;q=0.3' (length=26)
Run Code Online (Sandbox Code Playgroud)


有关更多信息,您可以查看HTTP RFC的第14.4节.

您可能会在PHP中找到许多代码示例来解析该标头; 例如:Parse Accept-Language来检测用户的语言

玩得开心 !


Imr*_*ran 8

这是我用于双语网站的脚本.它是用来作为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]);
?>
Run Code Online (Sandbox Code Playgroud)


Ser*_*huk 7

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

<?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
    */
Run Code Online (Sandbox Code Playgroud)

代码会将 HTTP_ACCEPT_LANGUAGE 字符串转换为以语言环境为键、权重为值的数组,从高值到低值排序。所以你可以一一使用 array_shift 来获得与你的站点语言环境的最佳匹配。

  • @hiburn8 已修复,请检查 (2认同)

mir*_*ong 5

您可以使用:Locale::acceptFromHttp()

尝试查找可以满足 HTTP“Accept-Language”标头请求的语言列表的区域设置。