За последние 24 часа нас посетили 31904 программиста и 1363 робота. Сейчас ищут 903 программиста ...

как сделать переключатель языка на сайте?

Тема в разделе "PHP для новичков", создана пользователем AlexsaiL, 7 июл 2017.

  1. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    не могу сделать переключатель на сайте, Определяю используемый браузером язык пользователя в файле index.php:
    PHP:
    1.  //==>> определение языка пользователя
    2.     preg_match('/^\w{2}/',$_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
    3.     switch (strtolower($matches[0])){
    4.         case "ru": $accept_lang = "ru"; break; // если русский
    5.         case "de": $accept_lang = "de"; break; // если немецкий
    6.         case "en": case "uk": case "us": $accept_lang = "en"; break; // если английский
    7.         case "ua": $accept_lang = "ua"; break; // если украинский
    8.         case "cn": $accept_lang = "cn"; break; // китайский
    9.         default: $accept_lang = "en"; break; // если нет совпадений, то по умолчанию, например, английский
    10.     }
    Т. е. определяю язык пользователя, передаю в модели, в моделях с БД выдает текст необходимого языка, контроллером возвращаю в файл c расширением .tpl , текст нужного языка выводится, все нормально. Но как реализовать ручную смену языка на сайте не могу догнать как, подскажи плз. либо через URL, либо через сессии?
     
  2. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    Я бы сделал как то так
    PHP:
    1. if(empty($_SESSION['custom_lang'])){
    2.      //тут определение языка из браузера
    3. }  else {
    4.     $accept_lang = $_SESSION['custom_lang'];
    5. }
     
  3. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    В регулярке ошибка. "\" даже для одинарных кавычек является экранирующим символом, поэтому в итоге Ваше регулярное выражение выглядит так:
    /^w{2}/
    Ставится два символа "\"
    PHP:
    1. '/^\\w{2}/'
     
  4. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    никогда не ставил... вроде работало всегда и не ругалось.. почему?
    --- Добавлено ---
    даже тут такого не пишут https://php.ru/manual/function.preg-match.html
    может с каким то другим языком перепутали синтаксис?
     
  5. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    а на странице как правильно прописать переключатели?
     
  6. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    У меня постоянно регулярки некорректно читались пока не докурил мануал. Но '\' - это точно экранирующий символ в php.
    https://php.ru/manual/language.types.string.html
    https://ru.stackoverflow.com/questi...-обратного-слеша-при-добавление-строки-в-базу
    Вот примеры ошибок:
    http://diman-novik-ru.livejournal.com/121243.html
     
    #6 Maputo, 7 июл 2017
    Последнее редактирование: 7 июл 2017
  7. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    ссылки где то сделать.. http://ваш_сайт/index.php?lang=ru

    а в коде
    Код (Text):
    1. if(isset($_GET['lang'])){
    2.    $_SESSION = $_GET['lang'];
    3. //а тут можно и редирект сделать сразу..
    4. }
    но я бы еще проверял что в сессию записывается..
     
  8. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    проверил, при смене языка на en приходит в сессию en, на ru приходит ru, при смене языка перебрасывает на главную страницу, т.к. прописан index.php?lang=ru, а если мне надо переключить язык и остаться на той же странице, это возможно сделать?
     
  9. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    Код (Text):
    1. echo '<a href="//' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'] . '&lang=ru">русский</a>';
    как то так должно быть)) но надо проверить)
     
  10. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    не работает
     
  11. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    сменный язык срабатывает только на главной странице, на остальные он не передается
     
  12. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    смотрите что на другие страницы приходит.. делайте var_dump($_GET); и смотрите что приходит и почему не записывается..
    отладка скрипта это стандартное времяпровождение для программера)
     
  13. SXdevel

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

    С нами с:
    24 июн 2017
    Сообщения:
    5
    Симпатии:
    0
    Не вводите людей в заблуждение, здесь используется не слеш, а как раз выполняется экранирование подмаски \w
     
  14. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Я уже понял. Мануал двояко написан. Пришлось проверить. Да, второй слеш не нужен в данной ситуации.
     
  15. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    if(isset($_GET['lang'])){
    $_SESSION = $_GET['lang'];
    $accept_lang = $_SESSION;
    }

    в футере в файле footer.tpl прописал кнопки переключения:
    HTML:
    1. <li>
    2.      <a  href="http://site:85/index.php?lang=ru">РУ</a>
    3. </li>
    4. <li>
    5.       <a href="http://site:85/index.php?lang=en">ENG</a>
    6. </li>
    на странице http://site:85/index.php после переключения языка на английский(http://site:85/index.php?lang=en) выводит через var_dump($_GET);
    Код (Text):
    1. array(1) {
    2.   ["lang"]=&gt;
    3.   string(2) "en"
    4. }
    но при переходе на другую страницу язык отпадает и в маршруте отображается через var_dump($_GET); только контроллер страницы.
     
  16. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    Вродь исправил) заработало))
     
  17. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    Алекс, я прописал
    PHP:
    1. $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']
    проверил что приходит, приходит, приходит:
    Код (Text):
    1. site.local/?controller=information&id=100&lang=ru
    результат присваиваю в переменную, и передаю в шаблонизатор на страницу смены языка, там подставляю в href=" " в тег <а>
    Скажи, можно как нить сделать ислючение, чтобы $_SERVER['REQUEST_URI'] не попадал &lang=ru, а язык я уже добавлял сам.
     
  18. Sergey_Tsarev

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

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    А я бы в куку выбор языка записывал. Человек вернётся на сайт через некоторое время, и сайт откроется на нужном языке, а не на языке установленном по умолчанию.
     
  19. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    Ну у меня сначала идет язык тот, который установлен в браузере пользователя, если он на сайте в ручную меняет на другой, то тогда подсовываю нужный язык. Вот только при выборе языка сейчас делаю так, чтобы он оставался на той же странице.
     
  20. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Делай на основе заголовков)
     
  21. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
  22. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23