Как создать простой переключатель языка PHP cookie? - PullRequest
7 голосов
/ 17 октября 2011

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

Я прочитал несколько руководств по куки-файлам и посмотрел несколько похожих примеров здесь, в 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.

Спасибо.

Ответы [ 5 ]

6 голосов
/ 18 октября 2011

Спасибо за все предложения - @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, а затем отправляет пользователя обратно на предыдущую страницу.

Готово! :)

3 голосов
/ 23 января 2013
if ( !empty($_GET['language']) ) {
    $_COOKIE['language'] = $_GET['language'] === 'en' ? 'en' : 'nl';
} else if ( empty($_COOKIE['language']) ) {
    $_COOKIE['language'] = 'nl';
}
setcookie('language', $_COOKIE['language']);
3 голосов
/ 17 октября 2011

Файл 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.Выполните несколько проверок, если хотите избежать петель перенаправления.

0 голосов
/ 19 октября 2016

Я использовал 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>
0 голосов
/ 17 октября 2011

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

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.

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

...