php多语言:语言重定向

时间:2014-07-08 12:12:08

标签: php multilingual http-accept-language

我一直在寻找,但似乎无法找到实现这一目标的正确方法:

为了创建多语言(2)网站,我考虑使用以下文件夹结构:

DOMAIN
    www.domain.com/index.php
    NL-folder
        www.domain.com/nl/index.php (alternative home.php?)
        www.domain.com/nl/pagina2.php
        ...
    EN-folder
        www.domain.com/en/index.php (alternative home.php?)
        www.domain.com/nl/page2.php
        ...

我读过有些人发现www.domain.com/index.php是一个令人讨厌的语言选择页面。

因此我认为此页面应显示与首选语言的索引/主页相同的内容。我听说过这可以通过使用标题字段Accept-Language来完成。另外,我应该显示www.domain.com/nl/index.php的内容或重定向(为了能够进行语言相关的查询,我觉得我必须将www.domain.com/index.php重定向到特定于语言的页面,以便语言可以选择?)。 当然,用户以后可以改变语言......

我完全坚持如何正确地实现这一点。

我唯一想到的就是重定向。使用http://www.thefutureoftheweb.com/blog/use-accept-language-header上的代码,这将成为:

$langs = array();
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
    preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);

    if (count($lang_parse[1])) {
        // create a list like "en" => 0.8
        $langs = array_combine($lang_parse[1], $lang_parse[4]);

        // set default to 1 for any without q factor
        foreach ($langs as $lang => $val) {
            if ($val === '') $langs[$lang] = 1;
        }

        // sort list based on value 
        arsort($langs, SORT_NUMERIC);
    }
}

// look through sorted list and use first one that matches our languages
foreach ($langs as $lang => $val) {
    if (strpos($lang, 'nl') === 0) {
        header("Location: http://domain.com/nl/index.php");
    } else if (strpos($lang, 'en') === 0) {
        header("Location: http://domain.com/en/index.php");
    } 
}

我的例子好吗,或者我应该采用不同的方式吗?

2 个答案:

答案 0 :(得分:0)

我认为这个问题没有一个答案。我在Zend Framework(v1)应用程序中写了一些关于multilanguage support的博客,并写了(实际上仍在编写)包含此内容的library

你在第一个目录路径中分离不同版本的方法是好的,但你需要一些重写规则,因为我想你不想在每个语言目录中复制代码! :)

如果浏览器的语言不在您支持的语言列表中,您还需要预先定义一组受支持的语言,并使用后备语言。

另外,正如Bartdude举例说明的那样,不要依赖访问者的国家来决定语言。

答案 1 :(得分:0)

Algorihtm

  • 检测index.php中的语言
  • 选择正确的语言以接受语言
  • 路线语言页面

检测接受语言

table_a <- structure(list(name = structure(c(2L, 1L, 5L, 3L, 4L), .Label = c("ALex", "John", "Kev", "Peter", "ToM"), class = "factor"), color = c("red", "blue", "green", "yellow", "pink")), row.names = c(NA, -5L), class = "data.frame")
table_b <- structure(list(name = structure(c(2L, 1L, 6L, 3L, 4L, 5L), .Label = c("Alexander", "Johnathan", "Kevin", "Luke", "Ryan", "Tomas"), class = "factor"), food = c("pizza", "tacos", "sushi", "cake", "brownies", "burgers")), row.names = c(NA, -6L), class = "data.frame")
table_c <- structure(list(name = structure(c(2L, 1L, 5L, 3L, 4L), .Label = c("Alexande1", "Johnatha", "Kevi1", "Luk1", "Toma1"), class = "factor"), food = c("pizza", "tacos", "sushi", "cake", "brownies")), row.names = c(NA, -5L ), class = "data.frame")

此函数将返回一个数组。例子:

function GetAcceptLanguageList(){
  $langs = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
  $list = [];
  {
    $ls = explode(",",$langs);
    foreach ($ls as $key => $value) {
      $lx=explode(";",$value);
      array_push($list,$lx[0]);
    }
  }
  return $list;
}

选择接受语言或默认语言后。 转到语言页面示例。 Array ( [0] => tr-TR [1] => tr [2] => en-US [3] => en [4] => la )

相关问题