Обнаружение языка PHP

Я пытаюсь создать multilangual сайт.

Я использую эту часть кода для обнаружения пользовательского языка. Если Вы не выбрали язык, он будет включать Ваш файл языка на основе HTTP_ACCEPT_LANGUAGE.

Я не знаю, где это получает его от хотя:

session_start();

if (!isset($_SESSION['lang'])) {
   $_SESSION['lang'] = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
}

elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'en') $_SESSION['lang'] = "en";
elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'sv') $_SESSION['lang'] = "sv";
elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'pl') $_SESSION['lang'] = "pl";
elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'fr') $_SESSION['lang'] = "fr";

include('languages/'.$_SESSION['lang'].'.php');

Это работает на меня и включает полировку файл Ленга. Но действительно ли этот код точен? Или есть ли иначе?

22
задан Kos 6 October 2019 в 22:25
поделиться

3 ответа

Браузер обычно отправляет HTTP-заголовок с именем Accept-Language, который указывает, какие языки пользователь желает получить.

Например, этот заголовок может быть:

Accept-Language: en-us,en;q=0.5

Есть понятие приоритета в нем, кстати; -)

В PHP вы можете получить это в $ _ SERVER суперглобальном:

var_dump($_SERVER['HTTP_ACCEPT_LANGUAGE']);

получите меня:

string 'en-us,en;q=0.5' (length=14)

Теперь вам нужно разобрать это ; -)


Если я изменю свои предпочтения в параметрах браузера, чтобы сказать: «Я хочу французский, а если вы не можете обслуживать меня по-французски, дайте мне английский из США; и если вы не можете получить меня что либо, просто дайте мне английский), заголовок будет:

Accept-Language: fr-fr,en-us;q=0.7,en;q=0.3

И из PHP:

string 'fr-fr,en-us;q=0.7,en;q=0.3' (length=26)


Для получения дополнительной информации вы можете взглянуть на раздел 14.4 HTTP RFC .

] И вы, вероятно, можете найти множество примеров кода в PHP для анализа этого заголовка, например: Синтаксический анализ Accept-Language для определения языка пользователя

Удачи!

35
ответ дан 29 November 2019 в 04:12
поделиться

Вот сценарий, который я использовал для двуязычного сайта. Он должен использоваться как index.php mysite.com . В зависимости от языковых предпочтений браузера пользователя он будет перенаправлять на желаемую языковую версию сайта или сайт по умолчанию, если сайт на предпочитаемом пользователем языке недоступен.

<?php
// List of available localized versions as 'lang code' => 'url' map
$sites = array(
    "en" => "http://en.mysite.com/",
    "bn" => "http://bn.mysite.com/",
);

// Get 2 char lang code
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

// Set default language if a `$lang` version of site is not available
if (!in_array($lang, array_keys($sites)))
    $lang = 'en';

// Finally redirect to desired location
header('Location: ' . $sites[$lang]);
?>
8
ответ дан 29 November 2019 в 04:12
поделиться

Ваш код выглядит нормально. Вы можете добавить последний вариант else по умолчанию, если посетитель запрашивает язык, который вы не предоставляете. Кроме того, если посетитель сам выбирает язык, вы должны сохранить этот выбор в постоянном файле cookie и проверить его значение, придав ему приоритет над HTTP_ACCEPT_LANGUAGE.

Насколько я могу судить, Youtube действительно использует HTTP_ACCEPT_LANGUAGE, но в то же время использует IP геолокация, чтобы предложить изменить язык, если язык страны посетителя не соответствует этому. Определенно раздражает.

Просто придирки: если вы собираетесь добавить языки в список, выражение switch () может быть более читаемым.

1
ответ дан 29 November 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: