За последние 24 часа нас посетил 20321 программист и 1010 роботов. Сейчас ищут 347 программистов ...

Двуязычный сайт, смена языка.

Тема в разделе "PHP для новичков", создана пользователем Vladchucha, 6 ноя 2019.

  1. Vladchucha

    Vladchucha Активный пользователь

    С нами с:
    12 ноя 2018
    Сообщения:
    167
    Симпатии:
    7
    Адрес:
    Nürnberg
    Добрый вечер,
    у меня сайт с двумя языками, реализован с помощью $_SESSION["lan"]
    и настроечных файлов для меню и пр.
    В начале каждого файла подключается
    PHP:
    1. include_once(dirname ( __FILE__, 2 ) . DIRECTORY_SEPARATOR . 'globalincluds/GLOBAL_INCLUDS.php')
    Его содержание:
    PHP:
    1.   include_once( dirname ( __FILE__, 1 ) . DIRECTORY_SEPARATOR . 'classes/dbmsql.php');
    2.   include_once("FUNCTIONS.php");      
    3.   include_once("FUNCTION_Rock.php");
    4.  
    5.   statistic_site_insert($dbmsql);
    6.    // Die Sprache ist ermittelt //
    7.     $lan = "";
    8.    if (!isset($_SESSION["lan"]))
    9.    {
    10.      $lang = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
    11.      $lan = str_replace(strstr($lang, ','), '', $lang);
    12.      $lan = substr( $lan,0,2);
    13.          
    14.      $_SESSION["lan"] = $lan;
    15.    }
    16.    if (isset($_REQUEST["lan"]))
    17.    {
    18.      $lan = $_REQUEST["lan"];
    19.      $_SESSION["lan"] = $lan;
    20.    }
    21.  
    22.    if ($lan == "")
    23.       $lan = $_SESSION["lan"];
    24.     /*  if (!isset($_SESSION["lan"]))
    25.     echo '<br>NO $_SESSION ';   else echo '<br>SESSIONS existiert !!!';*/
    26.    if ($lan == "" || ($lan != "de" && $lan != "ru")) $lan = "de";
    27.       $_SESSION["lan"] = $lan;
    28.  
    29. include_once("text_menu_".$lan.".php");
    Все работает, за исключением одного файла:
    https://www.rock-classic.com/www/kind-of-rockmusic.php-
    То есть, если на другой странице русский установил
    и потом перешел на этот файл, то он
    вызывается на немецком
    Переходя на другие страницы язык становится снова русским
    НЕ ПОНИМАЮ ВООБЩЕ, так как у меня на локальном сервере, дома
    все прекрасно правильно фурычит...
    Вот этот файл.

    PHP:
    1.    // FILE kind-of-rockmusic.php
    2.       include_once(dirname ( __FILE__, 2 ) . DIRECTORY_SEPARATOR . 'globalincluds/GLOBAL_INCLUDS.php');
    3.      if ($_SESSION["lan"] == 'de')
    4.          $seite_titel = 'Rockmusik-Genre';
    5.      if ($_SESSION["lan"] == 'ru')
    6.          $seite_titel = 'Жанры рок-музыки';
    7.      include_once('inc/head.php');        
    8. ?>
    9. <div style="padding-left:15px;"> <!--top:500px;width:auto;">-->
    10.     <img  class="img_first"   src="img/Egmond_S_17_061.jpg" alt="Muse"/>
    11.     <img  class="img_next"  src="img/Last_tree_0036f.jpg" alt="Last tree"/>
    12.    <?php  if ($_SESSION["lan"] == 'de')
    13.     {  ?>
    14.  
    15.       <h2>Genre von Rockmusik - ein Beispiel</h2>
    16.        <span class="span_b">Weiter eine  Klassifikation von<a href="http://www.hardharderheavy.de" target="_blank">
    17.            Rock- und Metal - Online-Magazin</a>
    18.        </span><br /><br />
    19.     <?php
    20.     }
    21.     if ($_SESSION["lan"] == 'ru')
    22.     {
    23.     ?>
    24.     <h2>Пример классификации жанров рок-музыки</h2>
    25.    <span class="span_b">Ниже вариант, предложенный на сайте <a href="http://www.hardharderheavy.de" target="_blank">
    26.        Rock- und Metal - Online-Magazin</a>
    27.    </span><br /><br />  
    28.    <?php
    29.      } ?>
    Есть какие-то соображения?
    Спасибо.
     
  2. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Вместо
    PHP:
    1. $seite_titel
    не лучше создать в одном месте массив, который можно в любое время изменить?
    Ведь легче будет работать.

    Например:
    PHP:
    1. $parse_lang = array
    2. (
    3.   'ru' => array
    4.   (
    5.      'title'       => 'Жанры рок-музыки',
    6.      'description' => 'description',
    7.      'keywords'    => 'keywords'
    8.   ),
    9.   'de' => array
    10.   (
    11.      'title'       => 'Rockmusik-Genre',
    12.      'description' => 'description',
    13.      'keywords'    => 'keywords'
    14.   )
    15. );


    PHP:
    1. $_REQUEST
    тебе все равно откуда придут данные? Я думаю это не так.






    Полный пример ниже, думаю разберешься и добавишь текст.

    PHP:
    1. <?php
    2.  
    3. //- Если пользователь выбрал язык сайта сам.
    4. if ( isset ( $_GET["lang"] ) and in_array ( $_GET["lang"], array ( 'ru', 'de' ) ) )
    5. {
    6.   $_SESSION["lang"] = $_GET["lang"];
    7. }
    8.  
    9. //- Предпочтительный язык пользователя
    10. preg_match('/^\w{2}/',$_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
    11. switch ( strtolower( $matches[0] ) )
    12. {
    13.  //- Русский
    14.  case "ru":
    15.   $accept_lang = "ru";
    16.  break;
    17.  
    18.  //- Немецкий
    19.  case "de":
    20.    $accept_lang = "de";
    21.  break;
    22.  
    23.  //- По дефолту
    24.  default:
    25.   $accept_lang = "ru";
    26.  break;
    27. }
    28.  
    29.  
    30. //- Ранее определенный язык сайта из $_SERVER['HTTP_ACCEPT_LANGUAGE']
    31. $lang = $accept_lang;
    32.  
    33. //- Данные о выборе языка есть в сессии
    34. if ( isset( $_SESSION["lang"] ) )
    35. {
    36.   $lang = $_SESSION["lang"];
    37. }
    38.  
    39.  
    40. //- Выбор языка
    41. $html = '
    42. <div>
    43. <a href="?lang=ru" style="color:'.($lang == 'ru' ? 'red' : '' ).'">Русский</a>
    44. <a href="?lang=de" style="color:'.($lang == 'de' ? 'red' : '' ).'">Немецкий</a>
    45. </div>
    46. ';
    47.  
    48. //-
    49. $parse_lang = array
    50. (
    51.   'ru' => array
    52.   (
    53.      'title'       => 'Жанры рок-музыки',
    54.      'description' => 'description',
    55.      'keywords'    => 'keywords'
    56.   ),
    57.   'de' => array
    58.   (
    59.      'title'       => 'Rockmusik-Genre',
    60.      'description' => 'description',
    61.      'keywords'    => 'keywords'
    62.   )
    63. );
    64.  
    65. ?>
    Код (Text):
    1.  
    2. <!DOCTYPE html>
    3. <html lang="<?=$lang?>">
    4. <head>
    5.     <meta charset="UTF-8">
    6.     <title > <?=$parse_lang[$lang]['title']?>  </title>
    7. </head>
    8. <body>
    9. <?=$html?>
    10.  
    11. TEST <?=$parse_lang[$lang]['title']?>
    12.  
    13. </body>
    14. </html>
     
    Vladchucha нравится это.
  3. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Vladchucha, кто тебя научил собак по коду разбрасывать, а потом жаловаться, что у тебя что-то не работает, а ты не знаешь почему?
    @session_start()
     
    AlexProg и Vladchucha нравится это.
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    я бы проверил доступна ли сессия конкретно в этом файле. отлаживайся!
    http://phpfaq.ru/debug
     
    Vladchucha нравится это.
  5. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Vladchucha, убирай собак, включай отображение ошибок.
    "Встань и иди" :)
     
    AlexProg нравится это.
  6. Vladchucha

    Vladchucha Активный пользователь

    С нами с:
    12 ноя 2018
    Сообщения:
    167
    Симпатии:
    7
    Адрес:
    Nürnberg
    Ок, спасибо, поищу еще, поэкпериментирую,однако,
    все равно не врубаюсь:
    есть где-то ошика, но почему она никак не проявляетя
    но моем сервере, и проявляется там, в облаках...?
     
  7. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Vladchucha, банально разные настройки серваков.
     
    Vladchucha нравится это.
  8. Vladchucha

    Vladchucha Активный пользователь

    С нами с:
    12 ноя 2018
    Сообщения:
    167
    Симпатии:
    7
    Адрес:
    Nürnberg
    Абстрактно конечно логичый ответ,
    но что конкретно влияет, пока ума не проложу,
    видимо придется на Сервере ловить.
    Собак, кошек убрал, $_SESSIONS проверил,
    пока у меня на локальном говорит, что все хорошо и жизнь хороша....
    --- Добавлено ---
    Да, так лучше, спасибо !!
     
    lastdays нравится это.
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    @Vladchucha попробуй почистить все куки домена. Куки они такие коварные, их может быть больше чем нужно.
     
  10. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Сам разок на этот "прекрасный" момент попался, с чем связано?
    Со стороны все идентично выглядело)
    --- Добавлено ---
    Так что не работает то?
    Добавь вначале страницы. Может у тебя выводится что-то перед стартом сессии.

    Код (Text):
    1.  
    2. error_reporting(E_ALL);
    3. ini_set("display_errors","1");
    4. ini_set("display_startup_errors","1");
    лог ошибок изучи
     
    Vladchucha нравится это.
  11. Vladchucha

    Vladchucha Активный пользователь

    С нами с:
    12 ноя 2018
    Сообщения:
    167
    Симпатии:
    7
    Адрес:
    Nürnberg
    Так что не работает то?
    error_reporting(E_ALL); и т.д
    ничего не дает, куков нет, все работает,кроме:
    переходя на одну (и только с ней проблема) страницу
    https://www.rock-classic.com/www/kind-of-rockmusic.php
    произвольно (само) меняется знчение $_SESSIONS[lan]
    с русского на нем. язык. Переходя на другую страницу русский восстанавливаетя.
    Если я на немецком смотрю сайт и эту страницу, то все работает штатно.
    НО !! На моем лок. сервере этого бага нет !!!, все OK,
    2 раза уже все файлы по новой загрузил "наверх",
    результат тот же.
    Надо видимо виски выпить побольше....
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    чувак, вот это правильное направление. ты молодец!

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

    ты ошибаешся. сессия живёт благодаря сессионной куке.
     
    Vladchucha нравится это.
  13. Vladchucha

    Vladchucha Активный пользователь

    С нами с:
    12 ноя 2018
    Сообщения:
    167
    Симпатии:
    7
    Адрес:
    Nürnberg
    OK_ спасибо,
    попробую на выходных....
     
  14. Vladchucha

    Vladchucha Активный пользователь

    С нами с:
    12 ноя 2018
    Сообщения:
    167
    Симпатии:
    7
    Адрес:
    Nürnberg
    Итак, этот единственный паршивый файл не видит
    (не принимает) SESSIONS ID.
    НО только там, наверху.
    На моем сервере все хорошо.
    Ошибка состояла в том, что в этом файле
    был пробел переl началом PHP,
    то есть перед <?php .
    Пробел убрал, все нормально стало.
    Всем огромное спасибо.
    P.S.
    Все же очень странно для меня это,
    это в каких.то настройках определяется ?
     
  15. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Скачай и редактируй все файлы одним нормальным редактором. UTF8 без BOM. Погуглить можешь, всяко найдешь для себя что-то новое :)
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Есть настройка буферизированного вывода по умолчанию, не помню, как называется. Ваш пробел - это вывод, а после вывода не работает session_start(). Но если вывод идёт в буфер, а не сразу в ответ, то работает. Вообще, не понимал назначения этой настройки, сделали бы либо одно либо другое. Я никогда на неё не рассчитываю. PhpStorm пробелов не ставит. Но я пишу MVC, даже когда без фреймворка
     
    Valick и Vladchucha нравится это.
  17. Vladchucha

    Vladchucha Активный пользователь

    С нами с:
    12 ноя 2018
    Сообщения:
    167
    Симпатии:
    7
    Адрес:
    Nürnberg
    Мда...а Netbeansy наплевать,
    всем остальным думаю тоже..
    Спасибо, буду знать