Я делаю свой собственный веб-сайт, и мне удалось написать код, который позволяет пользователю перейти к языковой версии в соответствии с языком браузера. Вот сценарий:
<?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 }