PHP或htaccess通过接受语言重写URL?

PHP或htaccess通过接受语言重写URL?,php,.htaccess,http-accept-language,Php,.htaccess,Http Accept Language,我已经建立了我的网站,所以我只需要添加“?lang=en”或“?lang=es”来更改语言英语/西班牙语 当我进入网站时,例如http://domain.com/something/something_else?lang=es“,设置了cookie,以便我继续使用该语言浏览网站 public function setLanguage($setLang='') { if (!empty($setLang)) { $this->setup[

我已经建立了我的网站,所以我只需要添加“?lang=en”或“?lang=es”来更改语言英语/西班牙语

当我进入网站时,例如http://domain.com/something/something_else?lang=es“,设置了cookie,以便我继续使用该语言浏览网站

   public function setLanguage($setLang='')
   {
      if (!empty($setLang))
      {
         $this->setup['Session']->set($this->setup['Lang_Key'], $setLang);
      }
      else
      {
         if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
         {
            // Parse the Accept-Language according to:
            //    http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
            preg_match_all(
               '/([a-z]{1,8})' . // First part of language e.g en
               '(-[a-z]{1,8})*\s*' . // other parts of language e.g -us
               // Optional quality factor
               '(;\s*q\s*=\s*((1(\.0{0,3}))|(0(\.[0-9]{0,3}))))?/i',
               $_SERVER['HTTP_ACCEPT_LANGUAGE'],
               $langParse);

            $langs = $langParse[1];
            $quals = $langParse[4];

            $numLanguages = count($langs);
            $langArr = array();

            for ($num = 0; $num < $numLanguages; $num++)
            {
               $newLang = strtoupper($langs[$num]);
               $newQual = isset($quals[$num]) ?
                  (empty($quals[$num]) ? 1.0 : floatval($quals[$num])) : 0.0;

               // Choose whether to upgrade or set the quality factor for the
               // primary language.
               $langArr[$newLang] = (isset($langArr[$newLang])) ?
                  max($langArr[$newLang], $newQual) : $newQual;
            }

            // sort list based on value
            arsort($langArr, SORT_NUMERIC);
            $acceptedLanguages = array_keys($langArr);
            $preferredLanguage = reset($acceptedLanguages);

            $this->setup['Session']->set(
               $this->setup['Lang_Key'], $preferredLanguage);
         }
         else
         {
            $this->setup['Session']->set(
               $this->setup['Lang_Key'], $this->setup['Default_Language']);
         }
      }

      return $this->setup['Session']->get($this->setup['Lang_Key']);
   }
我想首先通过浏览器的“接受语言”值重定向我的用户,但如果他们愿意,允许他们继续使用其他语言浏览网站

最好的方法是什么?htaccess会与选择语言时设置的cookie一起工作吗

编辑:以下是我的更新代码和Paul答案:

编辑2:哦,我只有“恩”和“es”两种语言。我不确定此代码wpuld如何仅在这两者之间进行选择或设置默认值…:/

    if (isset($_GET["lang"]))
        $this->setLanguage($_GET["lang"]);
    elseif (isset($_COOKIE["language"]))
        $this->setLanguage($_COOKIE["language"]);
    elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
        {
        // Parse the Accept-Language according to:
        // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
        preg_match_all(
           '/([a-z]{1,8})' . // First part of language e.g en
           '(-[a-z]{1,8})*\s*' . // other parts of language e.g -us
           // Optional quality factor
           '(;\s*q\s*=\s*((1(\.0{0,3}))|(0(\.[0-9]{0,3}))))?/i',
           $_SERVER['HTTP_ACCEPT_LANGUAGE'],
           $langParse);

        $langs = $langParse[1];
        $quals = $langParse[4];

        $numLanguages = count($langs);
        $langArr = array();

        for ($num = 0; $num < $numLanguages; $num++)
        {
           $newLang = strtoupper($langs[$num]);
           $newQual = isset($quals[$num]) ?
              (empty($quals[$num]) ? 1.0 : floatval($quals[$num])) : 0.0;

           // Choose whether to upgrade or set the quality factor for the
           // primary language.
           $langArr[$newLang] = (isset($langArr[$newLang])) ?
              max($langArr[$newLang], $newQual) : $newQual;
        }

        // sort list based on value
        arsort($langArr, SORT_NUMERIC);
        $acceptedLanguages = array_keys($langArr);
        $preferredLanguage = reset($acceptedLanguages);

        $this->setLanguage($preferredLanguage);
     }
     else
        $this->setLanguage("en");
if(isset($\u GET[“lang”]))
$this->setLanguage($_GET[“lang”]);
elseif(isset($_COOKIE[“语言”]))
$this->setLanguage($_COOKIE[“language”]);
elseif(isset($\u服务器['HTTP\u接受\u语言]))
{
//根据以下内容分析Accept语言:
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
预赛(
“/([a-z]{1,8})//语言的第一部分,例如英语
“([a-z]{1,8})*\s*.//语言的其他部分,例如-us
//可选品质因数
“(;\s*q\s*=\s*((1(\.0{0,3}))|(0(\[0-9]{0,3})))?/i”,
$\u服务器['HTTP\u接受\u语言'],
美元(港币);;
$langs=$langParse[1];
$quals=$langParse[4];
$numLanguages=计数($langs);
$langArr=array();
对于($num=0;$num<$numLanguages;$num++)
{
$newLang=strtoupper($langs[$num]);
$newQual=isset($quals[$num])?
(空($quals[$num])?1.0:floatval($quals[$num])):0.0;
//选择是升级还是设置产品的品质因数
//初级语言。
$langArr[$newLang]=(isset($langArr[$newLang]))?
最大($langArr[$newLang],$newQual):$newQual;
}
//基于值的排序列表
arsort($langArr,SORT\u NUMERIC);
$acceptedLanguages=数组\ U键($langArr);
$preferredLanguage=重置($acceptedLanguages);
$this->setLanguage($preferredLanguage);
}
其他的
$this->setLanguage(“en”);

我用PHP做这件事。接受语言是一件复杂的事情。一个浏览器可以推荐一种以上它想要接受的语言(每种语言都有一个显示它喜欢哪种语言的质量因素)。对于我的网站,我有一个默认的显示语言(当我的翻译列表中没有任何接受语言时显示)。否则,如果没有语言集(setLang),我将通过解析Accept语言,根据浏览器最可接受的语言来选择它。我使用的函数如下所示(它包含用于设置cookies的会话管理器-但您可以通过直接调用$\u session[etc]=$foo;)重新实现该功能)

编辑:不幸的是,我的网站只有主要语言的翻译(EN、ES、FR),而没有(EN_-US、EN_-GB、ES_-MX、ES_-ES),因此我选择了其中指定的主要语言的最高质量因数

   public function setLanguage($setLang='')
   {
      if (!empty($setLang))
      {
         $this->setup['Session']->set($this->setup['Lang_Key'], $setLang);
      }
      else
      {
         if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
         {
            // Parse the Accept-Language according to:
            //    http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
            preg_match_all(
               '/([a-z]{1,8})' . // First part of language e.g en
               '(-[a-z]{1,8})*\s*' . // other parts of language e.g -us
               // Optional quality factor
               '(;\s*q\s*=\s*((1(\.0{0,3}))|(0(\.[0-9]{0,3}))))?/i',
               $_SERVER['HTTP_ACCEPT_LANGUAGE'],
               $langParse);

            $langs = $langParse[1];
            $quals = $langParse[4];

            $numLanguages = count($langs);
            $langArr = array();

            for ($num = 0; $num < $numLanguages; $num++)
            {
               $newLang = strtoupper($langs[$num]);
               $newQual = isset($quals[$num]) ?
                  (empty($quals[$num]) ? 1.0 : floatval($quals[$num])) : 0.0;

               // Choose whether to upgrade or set the quality factor for the
               // primary language.
               $langArr[$newLang] = (isset($langArr[$newLang])) ?
                  max($langArr[$newLang], $newQual) : $newQual;
            }

            // sort list based on value
            arsort($langArr, SORT_NUMERIC);
            $acceptedLanguages = array_keys($langArr);
            $preferredLanguage = reset($acceptedLanguages);

            $this->setup['Session']->set(
               $this->setup['Lang_Key'], $preferredLanguage);
         }
         else
         {
            $this->setup['Session']->set(
               $this->setup['Lang_Key'], $this->setup['Default_Language']);
         }
      }

      return $this->setup['Session']->get($this->setup['Lang_Key']);
   }
公共函数setLanguage($setLang='')
{
如果(!empty($setLang))
{
$this->setup['Session']->set($this->setup['Lang_Key'],$setLang);
}
其他的
{
如果(isset($\u服务器['HTTP\u接受\u语言]]))
{
//根据以下内容分析Accept语言:
//    http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
预赛(
“/([a-z]{1,8})//语言的第一部分,例如英语
“([a-z]{1,8})*\s*.//语言的其他部分,例如-us
//可选品质因数
“(;\s*q\s*=\s*((1(\.0{0,3}))|(0(\[0-9]{0,3})))?/i”,
$\u服务器['HTTP\u接受\u语言'],
美元(港币);;
$langs=$langParse[1];
$quals=$langParse[4];
$numLanguages=计数($langs);
$langArr=array();
对于($num=0;$num<$numLanguages;$num++)
{
$newLang=strtoupper($langs[$num]);
$newQual=isset($quals[$num])?
(空($quals[$num])?1.0:floatval($quals[$num])):0.0;
//选择是升级还是设置产品的品质因数
//初级语言。
$langArr[$newLang]=(isset($langArr[$newLang]))?
最大($langArr[$newLang],$newQual):$newQual;
}
//基于值的排序列表
arsort($langArr,SORT\u NUMERIC);
$acceptedLanguages=数组\ U键($langArr);
$preferredLanguage=重置($acceptedLanguages);
$this->setup['Session']->set(
$this->setup['Lang\u Key',$preferredLanguage);
}
其他的
{
$this->setup['Session']->set(
$this->setup['Lang\u Key'],$this->setup['Default\u Language'];
}
}
返回$this->setup['Session']->get($this->setup['Lang_Key']);
}

我用PHP做这件事。接受语言是一件复杂的事情。一个浏览器可以推荐一种以上它想要接受的语言(每种语言都有一个显示它喜欢哪种语言的质量因素)

不幸的是,我的网站只有主要语言的翻译(EN、ES、FR),而没有(EN_-US、EN_-GB、ES_-MX、ES_-ES),所以我选择了其中指定的最高质量因子作为主要语言

   public function setLanguage($setLang='')
   {
      if (!empty($setLang))
      {
         $this->setup['Session']->set($this->setup['Lang_Key'], $setLang);
      }
      else
      {
         if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
         {
            // Parse the Accept-Language according to:
            //    http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
            preg_match_all(
               '/([a-z]{1,8})' . // First part of language e.g en
               '(-[a-z]{1,8})*\s*' . // other parts of language e.g -us
               // Optional quality factor
               '(;\s*q\s*=\s*((1(\.0{0,3}))|(0(\.[0-9]{0,3}))))?/i',
               $_SERVER['HTTP_ACCEPT_LANGUAGE'],
               $langParse);

            $langs = $langParse[1];
            $quals = $langParse[4];

            $numLanguages = count($langs);
            $langArr = array();

            for ($num = 0; $num < $numLanguages; $num++)
            {
               $newLang = strtoupper($langs[$num]);
               $newQual = isset($quals[$num]) ?
                  (empty($quals[$num]) ? 1.0 : floatval($quals[$num])) : 0.0;

               // Choose whether to upgrade or set the quality factor for the
               // primary language.
               $langArr[$newLang] = (isset($langArr[$newLang])) ?
                  max($langArr[$newLang], $newQual) : $newQual;
            }

            // sort list based on value
            arsort($langArr, SORT_NUMERIC);
            $acceptedLanguages = array_keys($langArr);
            $preferredLanguage = reset($acceptedLanguages);

            $this->setup['Session']->set(
               $this->setup['Lang_Key'], $preferredLanguage);
         }
         else
         {
            $this->setup['Session']->set(
               $this->setup['Lang_Key'], $this->setup['Default_Language']);
         }
      }

      return $this->setup['Session']->get($this->setup['Lang_Key']);
   }
下面是一个未经测试的编辑,它应该从我的代码中删除大部分或所有依赖项。对不起,事情与我先前的回答不一致。我对我的函数进行了一些调用,并对其他地方的语言进行了一些检查。下面的代码应该设置会话语言变量,您应该在其他地方使用该变量来确定正确的transla