Как настроить определение языка сайта?

212
21 июля 2022, 14:40

Я нашла вот такой код. Но не понимаю, как реализовать для моего варианта. У меня статический сайт, в котором 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];
?>
Answer 1

Что касаемо вашего случая: У вас 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>

Надеюсь помог.

Answer 2

Не работали перенаправления, потому что весь код был не в самом верху страницы. Я подняла код выше:

<!DOCTYPE HTML>
<html>

и сразу заработало.

READ ALSO
Как передать значения формы ajax запросом в php?

Как передать значения формы ajax запросом в php?

Не получается передать значения формы в php файлphp файл лежит в папке "/php/send

212
TokenMismatchException in compiled.php line 3314:

TokenMismatchException in compiled.php line 3314:

Добрый день возникла данная ошибка после ввода данных в поле на странице регистрации, вот ошибка https://istack

224
Как работает в данном случае str_replace php?

Как работает в данном случае str_replace php?

Как то давно я делал многоязычность c помощью phpИ когда очередь дошла до кнопок переключалок языка, мне посоветовали следующий код:

262
Вывод структуру(дерево) категорий

Вывод структуру(дерево) категорий

Нужно вывести дерево категорий, в бд таблица выглядит так:

222