За последние 24 часа нас посетили 56784 программиста и 1750 роботов. Сейчас ищет 871 программист ...

Мультиязычный сайт

Тема в разделе "PHP для новичков", создана пользователем AnteFil, 13 дек 2014.

  1. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Хочу создать мультиязычный сайт как лучше это сделать? Сесси куки или url или всё вместе
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Развивай мысль интересно послушать о всей архитектуре.
    Как все должно работать?
     
  3. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    это как удобно.
    в куки, да, но писать только перевыбранный язык. а умолчание определять по соответствующим заголовкам запроса.
    ну субддомен или фрагмент пути (да, как бы хост-порт-путь-запрос-анкер это всё входит в урл, сорьки) это куча "лишних" адресов. впрочем всегда будет понятно какую именно версию читает пользователь. можно и по одному урлу выдавать разный контент (по заголовкам/куке определяя язык) но тогда поисковику нужно будет сообщить что у страницы есть языковые варианты. а то он зайдет с разными настройками, увидит разные страницы и забанит за шум.
     
  4. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Я считаю что лучше в url сегмент для языка использовать
     
  5. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    какой именно сегмент урл? фрагмент пути? фрагмент хоста? а тогда фрагмент субдомен/домен/ти-эл-ди? давайте корректной терминологией выражаться, ну пожалуйста.
     
  6. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    А мне интересно было послушать про куки(((
    Байда страшная. Url как все, домен/язык.
     
  7. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Код (PHP):
    1. <?php
    2. // Массив доступных для выбора языков
    3. $LangArray = array("ru", "ua", "en");
    4. // Язык по умолчанию
    5. $DefaultLang = "ru";
    6. // Если язык уже выбран и сохранен в сессии отправляем его скрипту
    7. if($_SESSION['NowLang']) {
    8. // Проверяем если выбранный язык доступен для выбора
    9. if(!in_array($_SESSION['NowLang'], $LangArray)) {
    10. // Неправильный выбор, возвращаем язык по умолчанию
    11. $_SESSION['NowLang'] = $DefaultLang;
    12. }
    13. }
    14. else {
    15. // Достаём язык из куков так как в сесси нет
    16. if(isset($_COOKIE['NowLang'])){
    17.         $language = $_COOKIE['NowLang']; // получем язык сайта из куки
    18.     }else{
    19. // В куках нет языка делаем по умолчанию русским
    20. $_SESSION['NowLang'] = $DefaultLang;
    21. }
    22.  
    23. }
    24. // Выбранный язык отправлен скрипту через GET
    25. $language = addslashes($_GET['lang']);
    26. if($language) {
    27. // Проверяем если выбранный язык доступен для выбора
    28. if(!in_array($language, $LangArray)) {
    29. // Неправильный выбор, возвращаем язык по умолчанию
    30. $_SESSION['NowLang'] = $DefaultLang;
    31. }
    32. else {
    33. // Сохраняем язык в сессии
    34. $_SESSION['NowLang'] = $language;
    35. // Сохраняем язык в куки
    36. setcookie ("NowLang", $language, time() + 3600*24, "/"); // устанавливаем куку с языком сайта
    37. }
    38. }
    39. // Открываем текущий язык
    40. $CurentLang = addslashes($_SESSION['NowLang']);
    41. include_once ("language/language.".$CurentLang.".php");
    42.  
    43. ?>
    получилось что то вроде этого но как мне кажется долго обрабатывается или ошибся гдето

    Добавлено спустя 3 минуты 40 секунд:
    Может стоит как то запиать в sql вдруг пользователь авторизован и язык сайта у него записан ну если запись сделать .... или не стоит?
     
  8. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    огорчили вы меня очень((( база вам чем досадила?

    Куки в топку. Работаем с сессией. Если не задана сессия, дефолиный язык записываем в сессию.
    Есои задана используем выбранный пользователем язык. Все просто.

    Добавлено спустя 58 секунд:
    Боюсь спросить а addslashes зачем?
     
  9. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    человек пришел на сайт. показали тот язык который попросил его браузер.
    человек руками выбрал язык - записали в куку. если человек наш пользователь - записали выбранный язык в профиле и при авторизации запихиваем в куку. то есть работаем с заголовками. это быстро. и не требует лишних запросов к субд.

    Добавлено спустя 1 минуту 10 секунд:
    а можно обоснование использования сессии? ну чисто для общего развития.
     
  10. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Так а если я вот выбрал английский язык ушёл с сайта сессия оборвалась в следующий раз опять русский отобразиться Зачем???

    Добавлено спустя 1 минуту 22 секунды:
    Код (Text):
    1. а можно обоснование использования сессии? ну чисто для общего развития.
    Ну что бы не запрашивать постоянно язык а в случии чего обращаться к сессии
     
  11. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Мозжечком чую нет там аторизации и профилей.

    Ты на своих сайтах через куки язык определяешь?

    Добавлено спустя 1 минуту 8 секунд:
    Не будь перфекционистом. Покажи где запоминается язык.
     
  12. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Выше писали, используй example.com/ru/, куки можешь использовать, когда человек выбрал язык, чтобы по возвращению был его выбор (перенаправлять в ru/, en/).
    Ещё браузер сообщает какой язык используют в системе, по нему можешь делать выбор за человека, пока он сам не определился.
     
  13. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну не тебе вопрос был. но раз ты ответил то ты тоже не прав. закрыл чувак браузер (случайно срукожопил), открыл обратно, открыл сайт и вот ведь тваюмать - опять язык придется выбирать. а кука будет всегда прилетать вместе с каждым запросом к веб-серверу. как и другой заголовок. и по ним двум мы тупо определим один раз глобальную переменную (константу) с именем языка. никаких лишних сессий, никаких запросов к субд.

    Добавлено спустя 4 минуты 2 секунды:
    если мы переводим только интерфейс сайта то зачем нам городить огород с субдоменами/доменами/тлд/фрагментами пути. если у нас языкозависимый контент то возможны варианты, при которых в куках всё равно будет выбранный язык. банально чтоб интерфейс был в выбранном языке, а контент - в контекстном. как контекст делать уже кому как удобно и душа лежит.
     
  14. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Пионеры не ищут легких путей.
    Сложно спорить.

    Добавлено спустя 4 минуты 49 секунд:
    Чем координально отличается от кук?
    Ничем, разве что куки могут быть отключены. С сессией гораздо удобней работать, выдумвать сложности на пустом месте глупо. У человека обычный сайт, без всяких поддоменов и т.д.
    90% делают через указание в url. С эстетической стороны мне так приятней.
     
  15. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну а можно аргументы против такого решения услышать? ну и пару примеров других решений?
     
  16. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Поясните мне вот такой момент скрипт отрабатывает за 0.000640869140625 и после того как он отработал в браузере продалжает крутиться иконка мол сайт ещё грузиться это как так?

    Добавлено спустя 24 секунды:
    ещё секунды 3
     
  17. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    холивар на тему выключенного джаваскрипта. проходили. дальше.
    $lang = $c['lang'] в разы сложнее чем $lang = $s['lang'] перед которым еще и сессию надо не забыть стартануть. понятно, чем больше строк в алгоритме тем он тебе кажется проще. ок.
    тогда спор закончен наверное. адекватных примеров нет. неуместные тычки зачем-то есть. ведь мы про разные вещи говорим. не заметил?

    Добавлено спустя 21 секунду:
    смотри кто соединения не закрыл. кипэлайв и всё такое.
     
  18. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    А как посмотреть кто не закрыл соединения ?
     
  19. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Проверь network через браузер он все загрузил?

    Добавлено спустя 1 минуту 14 секунд:
    Тебя пугает сессион старт? Сессия на 99.9999% сайтах испоьзуется.

    Добавлено спустя 51 секунду:
    Ну ок. Мне код писать надо и сегодня сдать:)
     
  20. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ну сессия файлы дёргает по умолчанию, а cookie нет, думаю в вакууме куки лучше чтобы хранить 1 параметр
     
  21. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Надо отталкиваться от задачи, если ее можно решить быстро просто надо так и делать.
    Не вижу ничего плохого в сессии, куки излишни, а выдумывать как бы мозг помучить это глупо.
     
  22. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    да почему куки-то излишни?))))

    можно другие бэкэнды выбрать, мемкэш тот же - озу дергается в тысячи раз чаще файлов.
     
  23. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    И че? Пусть дергает. Такая у них судьба. Если это в качестве оптимизации то это глупо(((

    Добавлено спустя 47 секунд:
    С пхп жопа, переходите на django:)

    Добавлено спустя 2 минуты 42 секунды:
    Да ну нафиг они? Зачем запоминать какой язык выбрал пользователь? Зайдет еще раз выберет, не помрет.
    Если никто не ставит такой задачи, а ее очень редко кто поставит, для админки может быть, то и реализовывать не надо.
     
  24. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну как бы а зачем на серваке хранить лишние данные о языке. язык/тему и тому подобное юзер выбрал - зачем мне ради него сессию создавать?
    глупо если у меня зашло миллион посетителей создавать миллион сессий если допустим у меня сайт не имеет в себе никакой реализации "личного кабинета". тогда как раз пусть пара байт у каждого из миллиона в куках похранится. мне так будет приятнее.

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

    тс, ты за нашими спорами что-нибудь полезное усвоил?
     
  25. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Считаю надо сразу оговориться о чем речь: язык интерфейса или язык контента.

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

    Как хранить предпочтения незареганных юзеров, помоему пофигу. Если в движке сессии уже используются зачем-то, можно еще один параметр добавить. Если не используются — то проще в куку засунуть. (А если подумать о времени жизни сессии, то язык в куке предпочтительнее в любом случае.)

    Я так думаю.