[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Определения языка браузера и последующий редирект
Страницы: 1, 2
Kiriill1
Всем, доброго дня

Подскажите пожалуйста рабочий пример, для "Определения языка браузера и последующий редирект на русскоязычную версию сайта для русской версия браузера, английский язык во всех других случаях",

Сам перечитал тону мануалов, но рабочей версии не нашёл. Например, в режиме инкогнито google chrome на MacOS всегда показывает английский язык, а Safari русский

Вот например при заходе на сайт www.minecraft.net если у меня операционнка на русском языке во всех браузера, а также в инкогнито режимах перекидывает на русскоязычную версию сайта, как это реализовано?


Заранее спасибо
Zzepish
Kiriill1
Самый адекватный вариант - просмотреть заголовки. Брать из них. Есть еще вариант - смотреть по локации пользователя (по IP). Есть сервисы, которые выдают информацию такого рода.
Kiriill1
Цитата (Zzepish @ 19.08.2020 - 16:46)
Kiriill1
Самый адекватный вариант - просмотреть заголовки. Брать из них. Есть еще вариант - смотреть по локации пользователя (по IP). Есть сервисы, которые выдают информацию такого рода.

При таком варианте
--------------
<?php
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
$acceptLang = ['fr', 'it', 'en'];
$lang = in_array($lang, $acceptLang) ? $lang : 'en';
require_once "index_{$lang}.php";

?>


Результат
------------
Google chrome - показывает как en; А, Safari - показывает как ru; Хотя у меня оба браузера русско язычные и операционка MacOS - также на русском языке
Valick
самый адекватный вариант это предоставить пользователю возможность выбора языка и сохранить информацию об этом в куках

_____________
Стимулятор ~yoomoney - 41001303250491
Zzepish
Valick
Это уже дальнейшее развитие функционала. Но - да, согласен.
Zzepish
Kiriill1
Смотри на заголовки smile.gif Есть ресурсы, которые их показывают wink.gif От туда и отталкивайся )
sergeiss
А почему именно на ПХП? Можно ж сделать проверку в самом браузере. Например, вот так https://developer.mozilla.org/ru/docs/Web/A...nguage/language, хотя, может, есть и еще какие-то варианты smile.gif
Сначала смотришь на серверной стороне - если в куках нет языка (ты его туда еще не записал), то грузишь просто небольшую страничку HTML, с небольшим скриптиком JS. Определяешь язык, пишешь его в куки и перезагружаешь - тогда на сервере уже увидишь, что в куках есть то, что надо, и всё загрузится правильно.

PS. Я бы еще, возможно, в локал сторедж записал этот язык. Тогда тот "тестовый" скрипт должен еще проверить LS. Если там есть инфа о языке, то взять её. Потому что только ты мог её туда записать. Но это будет дублирование, возможно, что не обязательное.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Kiriill1
Цитата (sergeiss @ 20.08.2020 - 00:36)
А почему именно на ПХП? Можно ж сделать проверку в самом браузере. Например, вот так https://developer.mozilla.org/ru/docs/Web/A...nguage/language, хотя, может, есть и еще какие-то варианты smile.gif
Сначала смотришь на серверной стороне - если в куках нет языка (ты его туда еще не записал), то грузишь просто небольшую страничку HTML, с небольшим скриптиком JS. Определяешь язык, пишешь его в куки и перезагружаешь - тогда на сервере уже увидишь, что в куках есть то, что надо, и всё загрузится правильно.

PS. Я бы еще, возможно, в локал сторедж записал этот язык. Тогда тот "тестовый" скрипт должен еще проверить LS. Если там есть инфа о языке, то взять её. Потому что только ты мог её туда записать. Но это будет дублирование, возможно, что не обязательное.

Я думаю это стандартная задача, которую наверника решили уже и выложели в github, может кто-то видел уже?
sergeiss
Цитата (Kiriill1 @ 20.08.2020 - 12:17)
Я думаю это стандартная задача, которую наверника решили уже и выложели в github, может кто-то видел уже?

Может и выложили уже кто-то где-то. Но, по-моему, сделать это на пару порядков быстрее, чем искать на гитхабе. Там же еще разбираться надо будет, то ли это, что тебе нужно. И не надо ли переделать под себя. В итоге усилий и времени уйдет больше.
С гитхаба имеет смысл брать какие-нибудь более-менее серьёзные библиотеки или просто компоненты чего-нибудь.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
killer8080
Цитата (Valick @ 19.08.2020 - 16:06)
самый адекватный вариант это предоставить пользователю возможность выбора языка и сохранить информацию об этом в куках

самый правильный путь имхо smile.gif

Цитата (Kiriill1 @ 19.08.2020 - 14:43)
Например, в режиме инкогнито google chrome на MacOS всегда показывает английский язык, а Safari русский

странно, проверил на линухе, в приватном режиме хром не скрывает язык, Accept-Language такой же как в обычном режиме. Возможно это специфично для мак оси blink.gif
Kiriill1
посмотри в консоли какие заголовки шлёт хром в приватном режиме и сравни с navigator.language в js. Есть отличие?

Цитата (Zzepish @ 19.08.2020 - 15:46)
Есть еще вариант - смотреть по локации пользователя (по IP)

очень плохой вариант, страна пользователя по ip определяется весьма криво, особенно сейчас в эру впн-ов и торов. К тому же страна не однозначно определяет языковые предпочтения, например какой язык выбрать для Канады или Украины? Не говоря уже о том, что пользователь может быть туристом в чужой стране (про впн уже сказал) smile.gif
Вот язык в системе, это другое дело, пользователь его сам выбрал.

Цитата (sergeiss @ 19.08.2020 - 23:36)
грузишь просто небольшую страничку HTML, с небольшим скриптиком JS. Определяешь язык, пишешь его в куки и перезагружаешь - тогда на сервере уже увидишь, что в куках есть то, что надо, и всё загрузится правильно.

тут есть риск получить циклический редирект, при отключенных куках, лучше редиректить сразу на js и фолбэк на случай отключенного js опять же нужен. Второй вопрос как к этому отнесутся поисковики.
Kiriill1
в index.php в начало страницы вставил
----------------
<?php

preg_match('/^\w{2}/', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $m);
switch (strtolower($m[0])) {
case 'ru': header('Location: /ru/index.php'); break;
}

...
...
...

----------------

index.php - сайт на английском (по умолчанию)
/ru/index.php - русская версия

Соответсвенно:
1) если у пользователя в браузере любая локаль(кроме русской) - index.php продолжает дальше програжаться
2) если у пользователя в браузере русская локаль index.php делает редирект на /ru/index.php
killer8080
Цитата (Kiriill1 @ 20.08.2020 - 20:00)
Соответсвенно:
1) если у пользователя в браузере любая локаль(кроме русской) - index.php продолжает дальше програжаться
2) если у пользователя в браузере русская локаль index.php делает редирект на /ru/index.php

1 а если пользователь всё таки хочет попасть на английскую версию? Нет механизма ручного выбора языка.
2 как поисковики узнают про русскую версию? Есть sitemap для них?
3 твоя регулярка по факту делает тоже самое, что и substr в первом варианте, смысл вообще тут в регулярке?
Kiriill1
Цитата (killer8080 @ 20.08.2020 - 22:33)
Цитата (Kiriill1 @ 20.08.2020 - 20:00)
Соответсвенно:
1) если у пользователя в браузере любая локаль(кроме русской) - index.php продолжает дальше програжаться
2) если у пользователя в браузере русская локаль index.php делает редирект на /ru/index.php

1 а если пользователь всё таки хочет попасть на английскую версию? Нет механизма ручного выбора языка.
2 как поисковики узнают про русскую версию? Есть sitemap для них?
3 твоя регулярка по факту делает тоже самое, что и substr в первом варианте, смысл вообще тут в регулярке?

1. Да, на сайте есть выбор языка (красивая панелька)
2. Да есть sitemap
3. А, как покрасивше написать код? "я пока ещё не волшебник, а только учусь"
sergeiss
Цитата (killer8080 @ 20.08.2020 - 20:32)
тут есть риск получить циклический редирект, при отключенных куках

Может быть smile.gif Я ж не окончательный алгоритм давал, а накидывал идеи.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
killer8080
Цитата (Kiriill1 @ 20.08.2020 - 22:37)
Да, на сайте есть выбор языка (красивая панелька)

в приведённом коде она не будет работать, ведь у тебя браузеры с русской локалью принудительно редиректятся на русскую версию. О чём я и говорил
Цитата (killer8080 @ 20.08.2020 - 21:33)
Нет механизма ручного выбора языка.

выбор языка должен как то фиксироваться и учитываться перед редиректом.
Цитата (Kiriill1 @ 20.08.2020 - 22:37)
А, как покрасивше написать код? "я пока ещё не волшебник, а только учусь"

красота понятие относительное, особенно в коде :)
Ну во первых регулярка вида '/^\w{2}/' делает тоже самое что и substr(), но ресурсов жрет больше, хоть это и мизер в данном случае.
Во вторых обращение к $_SERVER['HTTP_ACCEPT_LANGUAGE'] без проверки на существование переменной, зачем в коде лишний нотис?
вариант с куками

$available_langs = ['ru', 'en']; // массив поддерживаемых локалей
$selected_lang = isset($_COOKIE['lang']) && in_array($_COOKIE['lang'], $available_langs) ? $_COOKIE['lang'] : null;
$browser_lang = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)) : null;
$current_page_lang = 'en'; // тут должен быть язык текущего урл, реализация будет зависеть от архитектуры приложения. Для примера присвоен en

if ($selected_lang && $selected_lang != $current_page_lang) {
lang_redirect($selected_lang);
}

if (!$selected_lang && in_array($browser_lang, $available_langs) && $browser_lang != $current_page_lang) {
lang_redirect($browser_lang);
}

function lang_redirect ($lang) {
// здесь прверяем доступность указанной локализации для текущего урл
if ('<если недоступно>') {
return;
}

$url = '/'. $lang .'/index.php'; // определяем урл для редиректа, зависит от архитектуры и вида урл
header("Location: $url");
die;
}


смена языка будет происходить установкой кук либо на клиенте, либо на сервере.
Недостаток метода
1 смена языка невозможна при отключенных куки
2 если вдруг поисковый бот выставит заголовок с английской локалью, то не сможет проиндексировать русскую версию (это лишь предположение, я не знаю какие заголовки они шлют, но потенциально такая ситуация возможна)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.