Я нашла вот такой код. Но не понимаю, как реализовать для моего варианта. У меня статический сайт, в котором 4 файла для разных языков. Когда я прописала echo $sites[$lang];
мне показывает /index-fr.php
, то есть отрабатывает все верно, но не работает перенаправление. Подскажите, что я делаю не так?
<?php
// Создаем массив с адресами для каждого языкового кода
$sites = array(
"it" => "/index-it.php",
"en" => "/",
"de" => "/index-de.php",
"fr" => "/index-fr.php",
);
// получаем язык
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); // вырезаем первые две буквы
// проверяем язык
// перенаправление на субдомен
header('Location: /index-'.$sites[$lang].'.php');
echo $sites[$lang];
?>
Что касаемо вашего случая: У вас index и '.php' в функции перенаправления лишние, да и «слэш» перед «index» не нужен. Массив у вас возвращает полностью ссылку, а вы еще и сами написали «index-» и «.php» и у вас получилось что то типа «index-index-de.php.php».
Попробуйте так (в этом случае массив вообще не нужен):
header('Location: index-' . $lang . 'php');
А если хотите с массивом, то так (@mepihindeveloper этот способ в комментарии вам уже предложил):
header('Location: ' . $sites[$lang]);
Но так же у вас нет никакой проверки на случай, если у пользователя будет язык, которого в вашем списке нет. Нужно сделать проверку и в случае, если языка пользователя у вас нет, автоматически давать ему, например, en
.
Можно сделать так:
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);//Берем первые буквы языка браузера пользователя.
$acceptLang = ['ru', 'de', 'en'];//Ваши языки.
$lang = in_array($lang, $acceptLang) ? $lang : 'en';//Сравниваем язык браузера с имеющимися, если нет совпадения, по умолчанию английский язык(можете поменять).
$lang === 'en' ? '' : (in_array($lang, $acceptLang) ? header('Location: ' . $sites[$lang]) : '');//Редирект на другие языки, если их нет, пользователь остается на английском.
А в целом, вы уверены, что стоит для каждого языка отдельную страницу создавать? Что если у вас будет 100 страниц с разными языками и нужно будет для каждого что то добавить?
Так же php является шаблонизатором и позволяет упрощать некоторые вещи (почитайте об этом). Например header и footer можно не вставлять в каждую страницу сайте, а создать в отдельном файле и где нужно через include подключать. И так же другие повторяющиеся элементы. И получится, если вам нужно будет что то там отредактировать, то достаточно в одном файле сделать изменения, как они сработают на всех страницах.
А многоязычность на сайте я бы советовал делать через конфиги с переводами.Если интересно, вкратце опишу:
Создаете файл config.php. Я его поместил в папку configs\config.php.
Пишем логику:
<?php
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);//Берем первые буквы языка браузера пользователя.
$acceptLang = ['ru', 'de', 'en'];//Ваши языки.
$lang = in_array($lang, $acceptLang) ? $lang : 'en';//Сравниваем язык браузера с имеющимися, если нет совпадения, по умолчанию английский язык(можете поменять).
session_start();
if(!isset($_SESSION['lang']))
$_SESSION['lang'] = $lang;// Если сессия пустая, то ставим, то что пришло из проверки выше.
else if (isset($_GET['lang']) && $_SESSION['lang'] != $_GET['lang'] && !empty($_GET['lang'])) {
if ($_GET['lang'] == "en")
$_SESSION['lang'] = "en";
else if ($_GET['lang'] == "de")
$_SESSION['lang'] = "de";
else if ($_GET['lang'] == "ru")
$_SESSION['lang'] = "ru";
}
require_once "languages/" . $_SESSION['lang'] . ".php"; //Запрашиваем конфиг с переводами
?>
Такой конфиг у меня лежит в папке languages и внутри файлы : ru.php, en.php и т. д. Пример таких конфигов, en.php:
<?php
$langarr = array(
"tittleext" => "Exterier",
"tittleint" => "Interior",
"tittlecont" => "Contacts",
"tittleab" => "About Us",
"tittleequa" => "Quality",
"tittleoprj" => "Our projects",
"our_proj" => "Our projects",
"1bl" => "First block",
"2bl" => "Second block",
"3bl" => "Third block"
);
?>
ru.php
<?php
$langarr = array(
"tittleext" => "Экстерьер",
"tittleint" => "Интерьер",
"tittlecont" => "Контакты",
"tittleab" => "О нас",
"tittleequa" => "Качество",
"tittleoprj" => "Наши проекты",
"our_proj" => "Наши проекты",
"1bl" => "Первый блок",
"2bl" => "Второй блок",
"3bl" => "Третий блок"
);
?>
И по ключевому слову вставляем куда нам нужно (не забываем только подключить наш конфиг в наши шаблоны). В самом вверху подключаем:
<?php
include "configs/configlang.php";
?>
А сами переводы вставляем так:
<?php echo $langarr['tittleint'] ?>
Если вы хотите сделать переключалку языка:
<a href="?lang=de"><img class="lang" src="images/langde.png"></a>
<a href="?lang=en"><img class="lang" src="images/langen.png"></a>
<a href="?lang=ru"><img class="lang" src="images/langrus.png"></a>
Надеюсь помог.
Не работали перенаправления, потому что весь код был не в самом верху страницы. Я подняла код выше:
<!DOCTYPE HTML>
<html>
и сразу заработало.
Не получается передать значения формы в php файлphp файл лежит в папке "/php/send
Добрый день возникла данная ошибка после ввода данных в поле на странице регистрации, вот ошибка https://istack
Как то давно я делал многоязычность c помощью phpИ когда очередь дошла до кнопок переключалок языка, мне посоветовали следующий код: