我已经设置了我的网站,所以我只需要添加“?lang = en”或“?lang = es”来更改英语/西班牙语。
当我使用“http://domain.com/something/something_else?lang=es”进入网站时,会设置一个Cookie,以便我继续使用该语言浏览网站。
我想首先通过浏览器的“Accept-Language”值重定向我的用户,但是如果他们愿意,允许他们继续使用其他语言浏览网站。
最好的方法是什么? .htaccess会与选择语言时设置的cookie一起使用吗?
编辑:这是保罗回答的最新代码:
EDIT2:哦,我只有“en”和“es”语言。我不确定这个代码如何仅在这两个代码之间选择或者设置默认的......:/
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");
答案 0 :(得分:2)
我在PHP中这样做。接受语言是一件复杂的事情。浏览器可以建议它想要接受的多种语言(每种语言都有一个显示它更喜欢的品质因子)。对于我的网站,我有一个默认语言可供显示(当我的翻译列表中没有任何Accept-Languages时显示)。否则,如果没有语言集(setLang),我会通过解析Accept-Language,根据浏览器最可接受的选择它。我使用的功能如下(它包含我的会话管理器用于设置cookie - 但您可以通过直接调用$ _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']);
}
答案 1 :(得分:0)
我在PHP中这样做。接受语言是一件复杂的事情。浏览器可以推荐一种它想要接受的语言(每种语言都有一个显示它更喜欢的品质因子)。
不幸的是,我的网站只有主要语言(EN,ES,FR)的翻译,而不是(en_US,en_GB,es_MX,es_ES),所以我选择了这些主要语言中指定的最高质量因子。
下面是一个未经测试的编辑,它应该从我的代码中删除大部分或全部依赖项。对不起,我以前的回答让人感到困惑。我对我的函数进行了几次调用,并在其他地方进行了一些语言检查。下面的代码应该设置会话语言变量,您应该在其他地方使用它来确定正确的翻译。
它似乎比我以前的答案复杂得多,我不得不在我自己的代码中实现它。对于需要特定翻译(EN_US,EN_GB)的人,应修改以下代码以考虑preg_match_all中的匹配2。
$websiteLanguages = array('EN', 'ES');
session_start();
// The user wants a specific language regardless of their accept settings.
if (isset($_GET["lang"]))
{
$_SESSION["language"] = $_GET["lang"];
return;
}
// A language has already been decided upon.
if (isset($_SESSION["language"]))
{
return;
}
// No language has been chosen we should choose from the accept language.
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})' . // M1 - First part of language e.g en
'(-[a-z]{1,8})*\s*' . // M2 -other parts of language e.g -us
// Optional quality factor M3 ;q=, M4 - Quality Factor
'(;\s*q\s*=\s*((1(\.0{0,3}))|(0(\.[0-9]{0,3}))))?/i',
$_SERVER['HTTP_ACCEPT_LANGUAGE'],
$langParse);
$langs = $langParse[1]; // M1 - First part of language
$quals = $langParse[4]; // M4 - Quality Factor
$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
// langArr will now be an array like: array('EN' => 1, 'ES' => 0.5)
arsort($langArr, SORT_NUMERIC);
// The languages the client accepts in order of preference.
$acceptedLanguages = array_keys($langArr);
// Set the most preferred language that we have a translation for.
foreach ($acceptedLanguages as $preferredLanguage)
{
if (in_array($preferredLanguage, $websiteLanguages))
{
$_SESSION['Language'] = $preferredLanguage;
return;
}
}
}
// We will have returned by now if a language could be chosen, otherwise use
// our default language.
$_SESSION['Language'] = "EN";