【问题标题】:Auto detect language and redirect user自动检测语言并重定向用户
【发布时间】:2013-07-23 07:16:46
【问题描述】:

我正在做自己的网站,我设法编写了一些代码,根据浏览器的语言将用户引导到语言版本。这是脚本:

<?php
  if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "sv")
    header("location: index.php");
  if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "pt")
    header("location: pt/index.php");
  else 
    header("location: en/index.html");
?>

我已经把它放在 index.php 之前的 .它似乎可以正常工作,因为我不在说英语的国家,但我的浏览器是英文的,我被重定向到英文版本。

这是正确的吗?有没有更好/更清洁的方法来做到这一点?

【问题讨论】:

标签: php localization


【解决方案1】:

PHP 5.3.0+ 带有 locale_accept_from_http(),它从 Accept-Language 标头中获取首选语言。

您应该始终更喜欢这种方法而不是自写方法,因为标头字段比人们想象的要复杂。 (这是一个加权偏好列表。)

你应该像这样检索语言:

$lang = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);

但即便如此,您也不会只为每个英语用户提供en,为西班牙用户提供es。它可以变成much more difficult,而不是像es-ESes-US这样的标准。

这意味着您应该遍历您尝试的正则表达式列表并以这种方式确定页面语言。示例见PHP-I18N

【讨论】:

    【解决方案2】:

    好吧,我的代码遇到了一些问题,这并不奇怪,因为我不是 PHP 专家。因此,我一直在寻找可能的解决方案,并在另一个网站上找到了以下代码:

    <?php
        // Initialize the language code variable
    $lc = ""; 
        // Check to see that the global language server variable isset()
        // If it is set, we cut the first two characters from that string
    if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
        $lc = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
    
        // Now we simply evaluate that variable to detect specific languages
    if($lc == "fr"){
        header("location: index_french.php");
        exit();
    } else if($lc == "de"){
        header("location: index_german.php");
        exit();
    }
    else{ // don't forget the default case if $lc is empty
        header("location: index_english.php");
        exit();
    }
    ?>
    

    这完美地完成了工作!我只剩下一个问题。没有办法改变语言,即使直接链接到另一种语言,因为一旦页面加载,php 块会将我重定向到浏览器的语言。如果您居住在另一个国家并且以瑞典语作为母语,但您的浏览器是英文的,这可能会成为一个问题,因为您是在英国购买计算机的。

    因此,我针对此问题的解决方案是为每种语言(甚至是主要语言的版本)创建具有重复版本的文件夹,而 index.html 上没有此 php 代码(因此不是 index.php)。所以现在我的网站会自动检测语言,用户还可以选择手动更改它以防万一!

    希望它能帮助遇到同样问题的其他人!

    【讨论】:

    【解决方案3】:

    我认为你的想法很棒。可能会帮助你最短的代码:

    $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
    header("location: ".$lang."/index.php");
    

    【讨论】:

      【解决方案4】:

      这应该可以正常工作。您也可以使用http_negotiate_language 并讨论here

      【讨论】:

        【解决方案5】:

        这段代码最有用

            $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
        if(file_exists('system/lang/'.$lang.'.php'))
        {
            include('system/lang/'.$lang.'.php');
        }else{
            include('system/lang/en.php'); //set default lang here if not exists translated language in ur system
            }
        

        【讨论】:

        • 不幸的是,这是非常懒惰的代码,不支持优先级或标识符中超过 2 个字母的语言。
        猜你喜欢
        • 2017-01-06
        • 2012-09-18
        • 2021-03-13
        • 2020-07-25
        • 2015-03-04
        • 1970-01-01
        • 2012-08-27
        • 1970-01-01
        • 2018-07-29
        相关资源
        最近更新 更多