0

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

为了创建多语言(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语言选择页面很烦人。

因此,我认为此页面应以首选语言显示与索引/主页相同的内容。我听说这可以通过使用 headerfield 来完成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");
    } 
}

我的例子可以吗,还是我应该做不同的事情?

4

2 回答 2

0

我认为这个问题没有一个答案。我写了一些关于Zend Framework (v1) 应用程序中的多语言支持的博客,并写了(实际上仍在写)一个包含这个的库。

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

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

此外,正如 Bartdude 举的例子,不要依赖访问者所在的国家/地区来决定语言。

于 2014-10-07T12:06:28.173 回答
0

算法

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

检测接受语言

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
)

选择接受语言或默认语言后。路由到语言页面示例。/tr/index.php

于 2020-12-17T02:01:15.350 回答