За последние 24 часа нас посетили 17097 программистов и 1834 робота. Сейчас ищет 1601 программист ...

Как запомнить выбранный язык?

Тема в разделе "PHP для новичков", создана пользователем sherxan-g, 12 дек 2021.

Метки:
  1. sherxan-g

    sherxan-g Активный пользователь

    С нами с:
    11 июн 2018
    Сообщения:
    35
    Симпатии:
    0
    Cайт на двух языке - (ru, en) основное язык - (en). Уважаемые Программист скажите пожалуйста как сделать так чтобы после выбора языка (ru), вовремя перехода на главную страницу, вместе (www.site.com) загрузился (www.site.com/index.php?lang=ru) и наоборот.
    мой код:
    PHP:
    1. if(isset($_GET['lang']))
    2.   $language = $_GET['lang'];
    3. else
    4.   $language = "";
    5. if ($language == "ru") {
    6.    include("headerRU.php");
    7. } else {
    8. include("header.php");
    9. }
    HTML:
    1. <a href="index.php?lang=ru"><img src="img/flags/RU.gif" align="right" title="Russian"></a>
    2. <a href="index.php?lang=no"><img src="img/flags/GB.gif" align="right" title="English"></a>
    Низкий вам поклон...
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.850
    Симпатии:
    745
    Адрес:
    Татарстан
    На выбор SESSION/ cookies/ localstorage/sessionstorage
     
  3. Дюран

    Дюран Активный пользователь

    С нами с:
    9 мар 2018
    Сообщения:
    284
    Симпатии:
    21
    вы можете и ссылку на главную сделать с отметкой языка.

    Это ж как раз будет нормально, разные адреса - разные страницы, по контенту.

    Т.е. всегда язык палить по адресу.
     
    artoodetoo нравится это.
  4. Ag17

    Ag17 Новичок

    С нами с:
    19 ноя 2021
    Сообщения:
    5
    Симпатии:
    1
    Лучше всё-таки использовать get параметры. Если информацию о выбранной языковой версии хранить в контексте пользователя, то, например, делиться ссылками на страницу в нужной языковой версии будет сложновато. Ну то есть у страницы на выбранном языке нужно делать уникальный url. И по нему восстанавливать язык и показывать нужный контент.
     
    miketomlin нравится это.
  5. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    А зачем делиться ссылкой с нужной языковой версией? Основной язык должен определяться настройками браузера, а я уже сам выберу какой мне предпочтительно. Если я делюсь ссылкой, мне важно содержимое, а не то, на каком языке оно отобразится. Почти никогда язык не указывается в GET параметре. Языковые настройки хранятся обычно в куки, или в сессии
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.829
    Симпатии:
    651
    Вы Шо-то путаете, т.е. это явно не для случая ТСа. Речь об обычном сайте, а не ЛК и т.п.

    Если оч. хоЦа, вам никто не запрещает дополнительно иметь адреса для автодетекта языка. Но вот не иметь «языковых адресов» весьма опрометчиво.
    --- Добавлено ---
    P.S. Конечно, не обязательно использовать только GET-параметр. ЧЁ никогда не встречали ветки /ru/, /en/ и т.п. или языковые версии на отдельных (под)доменах?
     
  7. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Согласен, такое часто встречается, но обычно как раз таки такие ссылки формируются на сервере, и берутся эти значения из заранее установленных. У вас же нет ссылок на каждый раздел для каждого языка, ссылка одна, а то, на какую языковую версию сайта она ведёт уже и определяется параметром установленного языка, который в свою очередь устанавливается по умолчанию из настроек браузера, это чтоб случайно не выдать американцу, у которого всё на английском версию сайта на русском языке (Если такая возможность конечно предусмотрена, и сайт мультиязычный)
    --- Добавлено ---
    Нет, реализовать конечно можно по разному, можно брать этот параметр из GET, или по ЧПУ, и на основе него уже формировать ссылки, но это, как по мне не очень удобно. Зачем в ссылке лишняя информация, которую можно "спрятать" куда-нибудь в сессию?
     
    artoodetoo нравится это.
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.099
    Симпатии:
    1.243
    Адрес:
    там-сям
    @SamyRed не надо путать настройки интерфеса и язык контента. Если ссылаться на наш форум, то каждый раздел или тема имеет свой уникальный адрес, он не зависит от выбранных настроек языка для данного пользователя. НО!!!!! Если заведем разделы для тем на английском языке, или на украинском, то у этих разделов будут свои уникальные адреса и можно будет бросать ссылку либо "PHP для новичков" (рус), либо на "PHP for dummies" (eng). Понимаешь?

    Язык контента => свой адрес. не принципиально важно за счет чего — поддомен, папка в пути или параметр — это разные URL.
    Язык интерфейса => значение в куки или в сессии, на URL не влияет.
    --- Добавлено ---
    П.С. Не всем очевидно, что http://example.com/boogie и http://example.com/boogie?lang=ru это разные URL. Я не призываю делать многоязычность контента за счёт GET-параметров, помоему это некрасивый вариант. Но просто имейте в виду, что для поисковика параметры это часть адреса. Страницы c разными параметрами могут индексироваться независимо.
    Для указания "единственно верного" варианта адреса в странице может присутствовать ссылка на канонический адрес.
     
  9. artoodetoo

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

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

    1. Для страниц с разным языком содержимого нужны разные адреса и проще всего это сделать через "папки" /en/about-us, /ru/about-us и т.п.
    Для удобства администратора, CMS может помочь, храня несколько вариантов статьи для разных языков как логически единую запись. Но с т.з. посетителя и поисковика, варианты статьи на разном языке это разные страницы!

    2. Язык интерфейса, т.е. язык меню и сообщений, это отдельная задача. Он выбирается по убыванию значимости:
    - если пользователь залогинен, берем язык из его профиля
    - если не залогинен, но уже выбрал язык по ссылке - берем из куки
    - если не залогинен и не выбирал язык, берем из заголовка Accept-Language

    Теперь можно вернуться к вопросу ТС:
    Я бы не стал использовать параметр lang для всех страниц, а также не светил бы index.php в адресе.
    Допустим у нас есть обработчик выбора языка по адресу /set-language принимающий параметр lang.
    Код (HTML5):
    1. ...
    2. <a href="/set-language?lang=ru" rel="nofollow">РУ</a> |
    3. <a href="/set-language?lang=en" rel="nofollow">EN</a>
    Обработчик /set-language делает две вещи:
    1. Сохраняет выбранный язык в куку. А если пользователь ещё и залогинен, то дополнительно в поле его профиля. Это значение будет использоваться дальше для локализации меню и сообщений.
    2. Делает редирект на главную страницу в нужном языке, т.е. на /en/ либо /ru/.
    Так как у нас русский является языком по умолчанию, мы на главной странице / выводим копию страницы /ru/, а в шапке ставим
    Код (HTML5):
    1. <link rel="canonical" href="https://www.site.com/ru/" />
    2. ...
    Логично предположить, что главная на английском содержит ссылки на другие страницы тоже на английском. Но реально пользователь может гулять по сайту как ему заблагорассудится, заходя то на английские страницы, то на русские, но при этом у него язык меню уже выбран и сохранен в куке, он от URL не зависит. А вот контент напрямую зависит от URL и только от него!
     
    sherxan-g и Sail нравится это.
  10. Vladchucha

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

    С нами с:
    12 ноя 2018
    Сообщения:
    167
    Симпатии:
    7
    Адрес:
    Nürnberg
    А чем плохо хранить варианты в одном файле?
    То есть смотрим, какой язык сейчас " в действии" и тупо
    через if выбираем. Типа
    PHP:
    1. if ($_SESSION["lan"] == 'ru') {}
    2. if ($_SESSION["lan"] == 'en') {}
    Заголовки, меню через настроечные файлы.
    Так, например
    PHP:
    1. $text_menu = array();
    2.  
    3. $text_menu['start'] = "Главная";
    4. $text_menu['news'] = 'Новости';
     
    sherxan-g нравится это.