Как создать простой переключатель языка файлов cookie PHP?

#php #cookies #toggle

#php #файлы cookie #переключение

Вопрос:

Я пытаюсь настроить, как я думал, простой переключатель языка. Я думал, что буду использовать файлы cookie PHP, но они ведут себя не так, как предполагалось.

Я прочитал несколько руководств по использованию файлов cookie и рассмотрел несколько похожих примеров здесь, в StackOverflow, но, должно быть, я что-то упускаю, потому что он не может заставить его работать должным образом.

Я устанавливаю язык, передавая его в качестве переменной URL (lang = en или lang = ru). Кажется, все в порядке. Однако код, который у меня есть на данный момент, который устанавливает cookie, кажется, на один шаг позади, поэтому изначально он не имеет значения (я бы хотел, чтобы по умолчанию он был «en»), затем, если пользователь нажимает кнопку «ENG», он по-прежнему не имеет значения, а затем, еслипользователь нажимает русский, значение отображается как ‘en’, а затем, если я снова нажму кнопку ‘ENG’, значение отображается как ‘ru’.

Вот код, который я собрал вместе:

 if( $_GET['lang'] ) {
    $lang = (string)$_GET['lang'];
    setcookie( 'lang', $lang, time()   60*60*24*30 );
} elseif( !isset($_COOKIE['lang']) ) {
    $lang = 'en';
} else {
    $lang = $_COOKIE['lang'];
}
  

Как только я заработаю, я намерен использовать значение файла cookie для отображения меню на английском или русском языках, используя немного условного PHP.

Спасибо.

Комментарии:

1. Не рекомендуется использовать файлы cookie для определения языка. Отдельные URL-адреса — лучший выбор, люди могут напрямую ссылаться на контент на том же языке, который они используют на странице, на которой они размещают ссылку, и поисковые системы видят две отдельные страницы.

2. @Quentin хорошо подмечено. Тем не менее, я работаю с ограниченным бюджетом, поэтому требуется быстрое и простое решение. В принципе, есть (или будет) два основных меню, одно для английского и одно для русского. Редактор сайта создаст статьи на обоих языках, а затем назначит их соответствующему меню. На основе выбора пользователя и использования условных операторов будет отображаться только одно из этих меню. Это самый простой способ, который я мог придумать для этого…

3. @Quentin если создаются отдельные URL-адреса, как сайт должен помнить, что страница на французском языке должна ссылаться только на другую страницу сайта на французском языке?

4. @Quentin, поскольку в этой модели текст должен быть одинаковым для всех языков, поэтому ссылки указывают только на содержимое, язык можно добавлять разными способами.

Ответ №1:

Спасибо за все предложения — @Mob направил меня в правильном направлении, т.Е. Обработал файл cookie на другой странице, а затем отправил вас обратно на первую.

Я немного больше думал и экспериментировал, и я, наконец, решил это. Я опубликую приведенный ниже код, если кто-нибудь еще захочет его использовать.

На вашей главной странице поместите это:

 <form action="language_switcher.php" method="post">
    <select name="lang">
        <option value="en"<?php if( $_COOKIE["language"] == "en" ) { echo " selected"; } ?>>English</option>
        <option value="ru"<?php if( $_COOKIE["language"] == "ru" ) { echo " selected"; } ?>>Russian</option>
    </select>
    <input type="submit" value="Select Language">
</form>

<p>Language: <?php if( isset( $_COOKIE["language"] ) ) { echo $_COOKIE["language"]; } else { echo "<em>not set</em>"; } ?></p>
  

Затем в другом файле с именем ‘language_switcher.php’ поместите следующий код:

 $lang = "en";
if( isset( $_POST["lang"] ) ) {
    $lang = $_POST["lang"];
    setcookie ( 'language', $lang, time()   60*60*24*30, '/', 'mydomain.com');
    header( "Location: /previous_page_url.php" );
}
  

Пользователь выбирает язык и нажимает «Выбрать язык». Затем форма отправляет значение формы в ‘language_switcher.php ‘, который устанавливает файл cookie, а затем отправляет пользователя обратно на предыдущую страницу.

Готово! 🙂

Ответ №2:

Файл cookie недоступен до тех пор, пока не будет перезагружена страница настроек или не будет получен доступ к другой странице (другими словами, вы не можете установить и получить доступ к файлу cookie на той же странице).

Проверьте этот код :

 if( $_GET['lang'] ) {
    $lang = (string)$_GET['lang'];
    setcookie( 'lang', $lang, time()   60*60*24*30,'/' );
} elseif(  !$_GET['lang']) ) {
    $lang = 'en';
} else {
    $lang = $_GET['lang'];
}
header("Location: redirect_file.php")
  

Затем redirect_file.php вы перенаправляетесь обратно на страницу cookie. Выполните некоторые проверки, если вы хотите избежать циклов перенаправления.

Комментарии:

1. Я понимаю это, но то, что я пытаюсь сделать, невозможно? Вот процесс: пользователь нажимает кнопку «ENG», страница перезагружается, отправляя переменную URL ‘lang = en’ и устанавливая значение файла cookie.

Ответ №3:

 if ( !empty($_GET['language']) ) {
    $_COOKIE['language'] = $_GET['language'] === 'en' ? 'en' : 'nl';
} else if ( empty($_COOKIE['language']) ) {
    $_COOKIE['language'] = 'nl';
}
setcookie('language', $_COOKIE['language']);
  

Ответ №4:

Попробуйте это,

 if ( !isset( $_GET['lang'] ) ) { 
    if ( isset( $_COOKIE['lang'] ) ) { 
        $lang = $_COOKIE['lang']; 
    } 
    else { 
        $lang = 'en'; 
    } 
} 
else { 
    $lang = (string)$_GET['lang']; 
    setcookie( 'lang', $lang, time()   60*60*24*30 ); 
}
  

Если директива lang не установлена в GET, проверьте, есть ли набор файлов cookie.

Если это так, используйте его значение или используйте ‘en’ по умолчанию. Если установлена директива lang, установите cookie.

Это почти тот же код, но немного оптимизированный. (Лучше ставить условия, которые чаще всего отображаются поверх ifs.

Комментарии:

1. Спасибо за это, но, похоже, он делает то же самое, то есть отстает на один шаг. Было несколько опечаток, которые я исправил здесь: if ( !isset( $_GET['lang'] ) ) { if ( isset( $_COOKIE['lang'] ) ) { $lang = $_COOKIE['lang']; } else { $lang = 'en'; } } else { $lang = (string)$_GET['lang']; setcookie( 'lang', $lang, time() 60*60*24*30 ); }

2. действительно, я пропустил пару круглых скобок

Ответ №5:

Я использовал PHP $ _SERVER[‘PHP_SELF’] для обновления текущей страницы и учета выбранного языка.

Пример кода прилагается. имя файла: language_switcher.php

 <?php

    error_reporting(E_ERROR);

    $lang = "en";

    if( isset( $_COOKIE["language"] ) ) { 
       $lang = $_COOKIE["language"]; 
    }

    if( isset( $_POST["lang"] ) ) {
       $lang = $_POST["lang"];
       setcookie ( 'language', $lang, time()   60*60*24*30, '/','localhost');
       $refresh = $_SERVER['PHP_SELF'];
       header( "Location: $refresh");
    }
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Test Page Language Toggle</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>

<body>

    <?php 
      // Text definitions
      $text = array(
      'en' => array(
            'selectlang' => 'Select Language',
            'lingua' => 'Language: ',
            'filename' => 'You are in this location: '
          ),
      'fr' => array(
            'selectlang' => 'Séléctionner',
            'lingua' => 'Langue: ',
            'filename' => 'Vous lisez ce fichier: '
          )
      );

    ?>

    <form action="language_switcher.php" method="post">
        <select name="lang">
            <option value="en"<?php if( $_COOKIE["language"] == "en" ) { echo "selected"; } ?>>English</option>
            <option value="fr"<?php if( $_COOKIE["language"] == "fr" ) { echo " selected"; } ?>>Français</option>
        </select>
        <input type="submit" value="<?php echo $text[$lang][selectlang]; ?>">
    </form>

    <p><?php echo $text[$lang][lingua]; if( isset( $_COOKIE["language"] ) ) { echo $_COOKIE["language"]; } else { echo "<em>not set</em>"; } ?></p>

    <br>
    <p><?php echo $text[$lang][filename] . $_SERVER['PHP_SELF']; ?></p>

</body>
</html>