我正在尝试在网站上实现多语言之类的东西。原理是这样的:当用户进入网站时,将浏览器的语言设置为他,如果需要,他可以通过在表单中选择合适的语言来改变语言。
问题是,在单击按钮(将所选语言发送到服务器)之前,变量为$_POST
空,因此我无法将其写入会话以保存用户选择的语言,然后单击另一种语言的按钮,会话中的条目不会被覆盖。形式和ajax
要求:
$('#multilanguage li input').click(function select_lang() {
// id инпутов это сокращение от названия языка, так я определяю какая кнопка была нажата
// смотрим какая кнопка была нажата
var lang = $(this).attr('id');
//отправляем запрос
$.ajax({
type: "POST",
url: "php/header.php",
data: {
'lang': lang
},
cache: false,
success: function(response) {
console.log(response);
},
error: function(error) {
alert('bad');
console.log(error);
}
});
});
<form method="post" action="javascript:void(null);" id="multilanguage">
<li>
<input type="button" name="lang" value="English" id="en">
</li>
<li>
<input type="button" name="lang" value="Russian" id="ru">
</li>
</form>
这里php
:
@session_start();
//массив с языками для выбора
$lang_arr = [
"en" => array('English', 'Russian', 'Ukrainian'),
"ru" => array('Английский', 'Русский', 'Украинский')
];
//определяем язык браузера
preg_match_all('/([a-z]{1,8}(?:-[a-z]{1,8})?)(?:;q=([0-9.]+))?/', strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"]), $matches);
$langs = array_combine($matches[1], $matches[2]);
foreach ($langs as $n => $v)
$langs[$n] = $v ? $v : 1;
arsort($langs);
$default_lang = key($langs);
$default_lang = substr($default_lang, 0, 2);
//если пользователь не выбирал язык
if (!isset($_POST['lang'])) {
//проверяем совпадает ли его язык браузера с перечнем доступных языков
if(array_key_exists($default_lang, $lang_arr)) {
//если всё хорошо заносим его в сессию
$_SESSION['lang'] = $default_lang;
}else {
//если нет, то заносим в сессию английский язык
$_SESSION['lang']= 'en';
}
}
//если пользователь выбрал другой язык
if(isset($_POST['lang'])) {
//проверяем всё ли корректно
if(array_key_exists($_POST['lang'], $lang_arr)) {
//если всё хорошо заносим в сессию выбранный язык
$_SESSION['lang'] = $_POST['lang'];
}else {
//иначе ставим английский
$_SESSION['lang'] = 'en';
}
}
底线是用户的浏览器语言输入到会话中,但是当我单击另一种语言时,会话中没有任何内容被覆盖。告诉我如何做到这一点,以便在单击按钮后更新页面并更改会话中的语言?
首先,稍微改变一下表单,使语言不是 ID,而是按钮的属性或属性。例如
进一步这样的 JS 代码,在控制台中一切正常