Автоматическое определение языка и перенаправление пользователя

Я делаю свой собственный веб-сайт, и мне удалось написать код, который позволяет пользователю перейти к языковой версии в соответствии с языком браузера. Вот сценарий:

<?php if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "sv") header("location: index.php"); if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "pt") header("location: pt/index.php"); else header("location: en/index.html"); ?> 

Я поставил это в index.php перед. Кажется, он работает, потому что я не в англоговорящей стране, но мой браузер на английском языке, и меня перенаправляют на английскую версию.

Это верно? Есть ли лучший / более чистый способ сделать это?

PHP 5.3.0+ поставляется с locale_accept_from_http() который получает предпочтительный язык из заголовка Accept-Language .

Вы всегда должны использовать этот метод для самозанятого метода, поскольку поле заголовка более сложное, чем можно было бы подумать. (Это список взвешенных предпочтений.)

Вы должны получить такой язык:

$lang = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);

Но даже тогда вы не просто будете en для каждого английского пользователя и для испанских. Это может стать намного сложнее , и такие вещи, как es-ES и es-US являются стандартными.

Это означает, что вы должны перебирать список регулярных выражений, которые вы пытаетесь определить и определяете язык страницы таким образом. См. Пример PHP-I18N .

Ну, я столкнулся с некоторыми проблемами с моим кодом, что неудивительно из-за того, что я не эксперт по PHP. Поэтому я продолжал искать возможное решение, и я нашел следующий код на другом сайте:

 <?php // Initialize the language code variable $lc = ""; // Check to see that the global language server variable isset() // If it is set, we cut the first two characters from that string if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) $lc = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); // Now we simply evaluate that variable to detect specific languages if($lc == "fr"){ header("location: index_french.php"); exit(); } else if($lc == "de"){ header("location: index_german.php"); exit(); } else{ // don't forget the default case if $lc is empty header("location: index_english.php"); exit(); } ?> 

Это отлично работало! У меня осталась проблема. Невозможно было изменить язык, даже с прямыми ссылками на другой язык, потому что, как только страница загружалась, блок php перенаправлял меня на язык борссера. Это может быть проблемой, если вы живете в другой стране и имеете, например, шведский язык как родной язык, но у вас есть ваш браузер на английском языке, потому что вы купили свой компьютер в Великобритании.

Поэтому решение для этой проблемы состояло в том, чтобы создать папки с дублирующейся версией для каждого языка (даже для основного языка) без этого php-кода в index.html (и, следовательно, не index.php). Итак, теперь мой сайт автоматически обнаруживает язык, и пользователь также имеет возможность изменить его вручную в случае необходимости!

Надеюсь, это поможет кому-то другому с той же проблемой!

Я думаю, что твоя идея великолепна. Может помочь вам кратчайший код:

 $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); header("location: ".$lang."/index.php"); 

Это должно работать нормально. Вы также можете использовать http_negotiate_language и обсуждать здесь

Самый полезный этот код

  $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); if(file_exists('system/lang/'.$lang.'.php')) { include('system/lang/'.$lang.'.php'); }else{ include('system/lang/en.php'); //set default lang here if not exists translated language in ur system } в  $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); if(file_exists('system/lang/'.$lang.'.php')) { include('system/lang/'.$lang.'.php'); }else{ include('system/lang/en.php'); //set default lang here if not exists translated language in ur system } в  $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); if(file_exists('system/lang/'.$lang.'.php')) { include('system/lang/'.$lang.'.php'); }else{ include('system/lang/en.php'); //set default lang here if not exists translated language in ur system }